wrapper.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-"
  3. # vim: set expandtab tabstop=4 shiftwidth=4:
  4. """
  5. Copyright (C) 2012 Jhonny5 <jhonny5@riseup.net> + psy <epsylon@riseup.net>
  6. This program is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU Affero General Public License as published by
  8. the Free Software Foundation, either version 3 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU Affero General Public License for more details.
  14. You should have received a copy of the GNU Affero General Public License
  15. along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. """
  17. import os, sys
  18. import logging
  19. from core.gtk.config_gtk import *
  20. from core.gtk.error import AnontwiError
  21. from core.main import anontwi
  22. from core.encrypt import generate_key
  23. class IOManager(object):
  24. def __init__(self):
  25. self.backup = ''
  26. def CaptureOutput(self):
  27. from cStringIO import StringIO
  28. self.backup = sys.stdout
  29. sys.stdout = StringIO()
  30. def GetOutput(self):
  31. return sys.stdout.getvalue()
  32. def RestoreOutput(self):
  33. sys.stdout.close()
  34. sys.stdout = self.backup
  35. class WrapperAnontwi():
  36. """Wrapper Anontwi class."""
  37. """ PRIVATE """
  38. def __init__(self):
  39. self.log = logging.getLogger('Anontwi-Wrapper')
  40. self.app = anontwi()
  41. self.options = ''
  42. def _create_options(self, cmd):
  43. access = self.get_access_tokens()
  44. if access:
  45. self.log.debug('Access Token: ' + access['access_token'])
  46. self.log.debug('Secret Token: ' + access['secret_token'])
  47. cmd.append(access['access_token'])
  48. cmd.append(access['secret_token'])
  49. self.log.debug('[_create_options] cmd: ' + str(cmd))
  50. self.options = self.app.create_options(cmd)
  51. self.app.set_options(self.options)
  52. def _run(self, cmd):
  53. self.log.debug('Running Anontwi with commands: ' + str(cmd))
  54. self.app.run(cmd[1:])
  55. def get_app(self):
  56. return self.app
  57. """ ANONTWI GTK """
  58. def get_access_tokens(self):
  59. """Get AccessTokens from file.
  60. Returns:
  61. Dict with: {'access_token' : 'Access Token',
  62. 'secret_token' : 'Secret Token'}
  63. """
  64. file_path = DIR_TOKENS + FILE_ACC_TKN
  65. try:
  66. lines = open(file_path).readlines()
  67. return {'access_token' : lines[0].strip(),
  68. 'secret_token' : lines[1].strip() }
  69. except:
  70. self.log.info("Access tokens NOT found, path: %s" % file_path)
  71. return {}
  72. def get_consumer_tokens(self):
  73. """Get ConsumerTokens from file.
  74. Returns:
  75. ToDo
  76. """
  77. file_path = DIR_TOKENS + FILE_CONS_TKN
  78. try:
  79. lines = open(file_path).readlines()
  80. self.log.debug('[get_consumer_tokens]')
  81. self.log.debug('Path: ' + file_path)
  82. self.log.debug('- consumer_key: ' + lines[0].strip())
  83. self.log.debug('- consumer_secret: ' + lines[1].strip())
  84. return {'consumer_key' : lines[0].strip(),
  85. 'consumer_secret' : lines[1].strip() }
  86. except:
  87. self.log.info("Consumer tokens NOT found, path: %s" % file_path)
  88. return {}
  89. def get_source_api(self):
  90. """Get SourceApi from file.
  91. Returns:
  92. ToDo
  93. """
  94. file_path = DIR_TOKENS + FILE_SOURCE_API
  95. try:
  96. lines = open(file_path).readlines()
  97. self.log.debug('[get_source_api]')
  98. self.log.debug('Path: ' + file_path)
  99. self.log.debug('Source API: ' + lines[0].strip())
  100. return {'source_api' : lines[0].strip()}
  101. except:
  102. self.log.info("Source API NOT found, path: %s" % file_path)
  103. return {}
  104. def write_tokens(self, access, consumer, source_api):
  105. self.log.info('Writing tokens')
  106. # check directories
  107. if not os.path.exists(DIR_HOME_ANON):
  108. self.log.info(DIR_HOME_ANON + " created.")
  109. os.makedirs(DIR_HOME_ANON)
  110. if not os.path.exists(DIR_TOKENS):
  111. self.log.info(DIR_TOKENS + " created.")
  112. os.makedirs(DIR_TOKENS)
  113. if access:
  114. open(DIR_TOKENS + FILE_ACC_TKN, 'w').write(access['access_token'] + '\n' + access['secret_token'])
  115. if consumer:
  116. open(DIR_TOKENS + FILE_CONS_TKN, 'w').write(consumer['consumer_key'] + '\n' + consumer['consumer_secret'])
  117. if source_api:
  118. if source_api == "api.twitter.com":
  119. open(DIR_TOKENS + FILE_SOURCE_API, 'w').write(source_api)
  120. else:
  121. open(DIR_TOKENS + FILE_SOURCE_API, 'w').write(source_api)
  122. """ ANONTWI CORE """
  123. def send_tweet(self, tweet,
  124. pm = None,
  125. gps = None,
  126. wave = None,
  127. enc = None,
  128. proxy = None):
  129. """Send tweet.
  130. Args:
  131. tweet: text message to send.
  132. pm: {'pm' : 'bool value - is a pm message?,
  133. 'user' : 'name of the user recipient'}
  134. enc: {'enc' : 'bool value - encrypt the message?,
  135. 'pin : 'pin key for encrypted msg.' }
  136. proxy: {'proxy' : 'bool value - is proxy enable?',
  137. 'ip_address' : 'ip addres for proxy',
  138. 'port' : 'port for proxy'}
  139. """
  140. if os.path.isfile ('anontwi'):
  141. cmd = ['./anontwi']
  142. else:
  143. cmd = ['anontwi']
  144. if pm['pm'] is False:
  145. cmd.append('-m ' + tweet.strip() )
  146. else:
  147. cmd.append('-m ' + tweet.strip() )
  148. cmd.append('-d ' + pm['user'])
  149. if enc and enc['enc']:
  150. cmd.append('--enc')
  151. cmd.append('--pin=' + enc['pin'])
  152. if gps:
  153. cmd.append('--gps')
  154. app = self.get_app()
  155. cmd.append(app.geoposition)
  156. if wave:
  157. cmd.append('--waves')
  158. if proxy and proxy['proxy']:
  159. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  160. try:
  161. print "CMD ", cmd
  162. self._create_options(cmd)
  163. return self._run(cmd)
  164. except:
  165. return False
  166. def encrypt(self, message, key):
  167. cmd = ['anontwi']
  168. cmd.append('--enc')
  169. cmd.append('--pin=' + key)
  170. self._create_options(cmd)
  171. app = self.get_app()
  172. m_encrypt = app.encrypt(message, key)
  173. self.log.debug('[encrypt] Msg encrypted: ' + str(m_encrypt))
  174. return m_encrypt
  175. def decrypt(self, messages, key):
  176. cmd = ['anontwi']
  177. cmd.append('--dec=' + messages)
  178. cmd.append('--pin=' + key)
  179. self._create_options(cmd)
  180. app = self.get_app()
  181. msg = app.decrypt(messages, key)
  182. self.log.debug('[decrypt] Msg decrypted: ' + str(msg))
  183. return msg
  184. def get_user_info(self, proxy):
  185. try:
  186. self.log.debug('[get_user_info] loading info...')
  187. info=False
  188. app = self.get_app()
  189. consumer = self.get_consumer_tokens()
  190. access = self.get_access_tokens()
  191. if not consumer or not access:
  192. self.log.critical('Tokens not found! Could not retrieve user information.')
  193. else:
  194. info = app.get_user_info(consumer['consumer_key'],
  195. consumer['consumer_secret'],
  196. access['access_token'],
  197. access['secret_token'],
  198. proxy)
  199. except:
  200. self.log.critical('Could not retrieve user information.')
  201. return info
  202. def get_url(self, access, consumer, source_api, proxy):
  203. data = ''
  204. cmd = ['anontwi']
  205. cmd.append('--tokens')
  206. if proxy is not None and proxy['proxy'] is True:
  207. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  208. self.log.debug("GetUrl cmd: " + str(cmd))
  209. try:
  210. self.write_tokens(access, consumer, source_api)
  211. self._create_options(cmd)
  212. app = self.get_app()
  213. app = self.get_app()
  214. app.source_api = source_api
  215. app.set_oauth_urls()
  216. data = app.request_url(consumer['consumer_key'],
  217. consumer['consumer_secret'],
  218. source_api = source_api,
  219. gtk = True)
  220. self.log.debug("Sucesfull GetUrl")
  221. return data
  222. except:
  223. self.log.debug("Error GetUrl")
  224. return ''
  225. def insert_pincode(self, pin, oauth_token, oauth_token_secret,
  226. consumer, source_api, proxy=None):
  227. cmd = ["anontwi"]
  228. cmd.append("--tokens")
  229. if proxy:
  230. cmd.append('--proxy=' + proxy)
  231. self._create_options(cmd)
  232. app = self.get_app()
  233. consumer = self.get_consumer_tokens()
  234. try:
  235. self.log.debug("Inserting pincode.")
  236. return app.insert_pincode(oauth_token,
  237. oauth_token_secret,
  238. consumer['consumer_key'],
  239. consumer['consumer_secret'],
  240. source_api,
  241. pin, gtk = True)
  242. except:
  243. self.log.debug("Fail to insert pincode.")
  244. raise
  245. def get_reply_user(self, id):
  246. status = self.app.get_status(id)
  247. user = status.user.screen_name
  248. return user
  249. def reply(self, ID, msg, gps = None, enc = None, proxy = None):
  250. user = self.get_reply_user(ID)
  251. cmd = ['anontwi']
  252. cmd.append('-m ' + '@' + user + ' ' + msg )
  253. cmd.append('--reply=' + ID)
  254. if enc['enc'] is True:
  255. cmd.append('--enc')
  256. cmd.append('--pin=' + enc['pin'] +'')
  257. if gps:
  258. cmd.append('--gps')
  259. app = self.get_app()
  260. cmd.append(app.geoposition)
  261. if proxy['proxy'] is True:
  262. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  263. self._create_options(cmd)
  264. self._run(cmd)
  265. def retweet_tweet(self, ID, proxy=None):
  266. cmd = ['anontwi']
  267. cmd.append('-r')
  268. cmd.append(ID)
  269. if proxy:
  270. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  271. self._create_options(cmd)
  272. app = self.get_app()
  273. topics = app.send_retweet()
  274. def save_messages(self, user, num_ocurrences, proxy=None):
  275. cmd = ["anontwi"]
  276. cmd.append('--save')
  277. cmd.append(user + " " + num_ocurrences)
  278. if proxy:
  279. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  280. self.log.debug('[Backup] CMD: ' + str(cmd))
  281. self._create_options(cmd)
  282. app = self.get_app()
  283. self.log.debug('[Backup] Creating app: OK')
  284. saves = app.save_timeline()
  285. self.log.debug('[Backup] Return lines: ' + str(saves))
  286. return saves
  287. def favorite(self, ID, proxy=None):
  288. cmd = ['anontwi']
  289. cmd.append('--fav=' + ID)
  290. if proxy:
  291. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  292. self._create_options(cmd)
  293. self._run(cmd)
  294. def unfavorite(self, ID, proxy=None):
  295. cmd = ['anontwi']
  296. cmd.append('--unfav=' + ID)
  297. if proxy:
  298. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  299. self._create_options(cmd)
  300. self._run(cmd)
  301. def delete_tweet(self, ID, proxy=None):
  302. cmd = ['anontwi']
  303. cmd.append('--rm-m=' + ID)
  304. if proxy:
  305. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  306. self._create_options(cmd)
  307. self._run(cmd)
  308. def delete_private(self, ID, proxy=None):
  309. cmd = ['anontwi']
  310. cmd.append('--rm-d=' + ID)
  311. if proxy:
  312. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  313. self._create_options(cmd)
  314. self._run(cmd)
  315. def search_messages(self, textsearch,
  316. num_ocurrences, proxy=None):
  317. cmd = ["anontwi"]
  318. cmd.append('--ts=' + textsearch + " " + num_ocurrences)
  319. if proxy:
  320. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  321. self._create_options(cmd)
  322. app = self.get_app()
  323. messages = app.search_messages()
  324. return messages
  325. def generate_key(self):
  326. key = generate_key()
  327. return key
  328. def search_topics(self, proxy=None):
  329. cmd = ["anontwi"]
  330. cmd.append('--tt')
  331. if proxy:
  332. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  333. self._create_options(cmd)
  334. app = self.get_app()
  335. topics = app.search_topics()
  336. trendingtopics = ""
  337. for t in topics:
  338. self.topic = t.name
  339. trendingtopics = trendingtopics + self.topic + '\n'
  340. return trendingtopics
  341. def home_timeline(self, user, num_ocurrences, proxy=None):
  342. cmd = ["anontwi"]
  343. cmd.append('--tu=' + user + " " + str(num_ocurrences))
  344. if proxy:
  345. cmd.append('--proxy=' + proxy)
  346. self.log.debug('[Public] CMD: ' + str(cmd))
  347. self._create_options(cmd)
  348. app = self.get_app()
  349. self.log.debug('[Public] Creating app: OK')
  350. tweets = app.show_timeline()
  351. self.log.debug('[Public] Return lines: ' + str(tweets))
  352. return tweets, len(tweets)
  353. def search_favorite(self, user, num_ocurrences, proxy=None):
  354. cmd = ["anontwi"]
  355. cmd.append('--tfav=' + user + " " + num_ocurrences)
  356. if proxy:
  357. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  358. self.log.debug('[Favorites] CMD: ' + str(cmd))
  359. self._create_options(cmd)
  360. app = self.get_app()
  361. self.log.debug('[Favorites] Creating app: OK')
  362. favorites = app.show_favorites()
  363. self.log.debug('[Favorites] Return lines: ' + str(favorites))
  364. return favorites
  365. def mentions(self, num_ocurrences, proxy=None):
  366. cmd = ["anontwi"]
  367. cmd.append("--me=" + num_ocurrences)
  368. if proxy:
  369. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  370. self.log.debug('[Mentions] CMD: ' + str(cmd))
  371. self._create_options(cmd)
  372. app = self.get_app()
  373. self.log.debug('[Mentions] Creating app: OK')
  374. (mentions,num) = app.show_mentions()
  375. self.log.debug('[Mentions] Return lines: ' + str(mentions))
  376. return mentions, num
  377. def show_private(self, num_ocurrences, proxy=None):
  378. cmd = ["anontwi"]
  379. cmd.append('--td=' + num_ocurrences)
  380. if proxy:
  381. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  382. self.log.debug('[Private] CMD: ' + str(cmd))
  383. self._create_options(cmd)
  384. app = self.get_app()
  385. dms = app.show_timelinedm()
  386. self.log.debug('[Private] Creating app: OK')
  387. self.log.debug('[Private] Return lines: ' + str(dms))
  388. return dms
  389. def show_public(self, num_ocurrences, proxy=None):
  390. cmd = ["anontwi"]
  391. cmd.append("--tf=" + str(num_ocurrences))
  392. if proxy:
  393. cmd.append('--proxy=' + proxy)
  394. self.log.debug('[Home] CMD: ' + str(cmd))
  395. self._create_options(cmd)
  396. app = self.get_app()
  397. self.log.debug('[Home] Creating app: OK')
  398. (timelines, num_ocurrences) = app.show_timeline_friends()
  399. self.log.debug('[Home] Return lines: ' + str(timelines))
  400. return timelines, num_ocurrences
  401. def short_url(self, url, proxy=None):
  402. cmd = ['anontwi']
  403. cmd.append('--short=' + url)
  404. if proxy:
  405. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  406. print "CMD ", cmd
  407. self._create_options(cmd)
  408. app = self.get_app()
  409. short_url = app.short_url()
  410. self.log.debug('[Shorten URL] Shorten URL: ' + str(short_url))
  411. return short_url
  412. def suicide(self, proxy=None):
  413. cmd = ['anontwi']
  414. cmd.append('--suicide')
  415. if proxy:
  416. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  417. self._create_options(cmd)
  418. app = self.get_app()
  419. topics = app.suicide(self)
  420. self.log.debug('[Suicide]')
  421. def follow(self, user, proxy=None):
  422. cmd = ['anontwi']
  423. cmd.append('-f')
  424. cmd.append(user)
  425. if proxy:
  426. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  427. self._create_options(cmd)
  428. app = self.get_app()
  429. status = app.set_friend()
  430. self.log.debug('[Follow]' + str(user))
  431. return status
  432. def unfollow(self, user, proxy=None):
  433. cmd = ['anontwi']
  434. cmd.append('-u')
  435. cmd.append(user)
  436. if proxy:
  437. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  438. self._create_options(cmd)
  439. app = self.get_app()
  440. status = app.remove_friend()
  441. self.log.debug('[Unfollow]' + str(user))
  442. return status
  443. def block(self, user, proxy=None):
  444. cmd = ['anontwi']
  445. cmd.append('--block=' + user)
  446. if proxy:
  447. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  448. self._create_options(cmd)
  449. app = self.get_app()
  450. status = app.set_friend()
  451. self.log.debug('[Block]' + str(user))
  452. return status
  453. def unblock(self, user, proxy=None):
  454. cmd = ['anontwi']
  455. cmd.append('--unblock=' + user)
  456. if proxy:
  457. cmd.append('--proxy=' + proxy['ip_address'] + ':' + proxy['port'])
  458. self._create_options(cmd)
  459. app = self.get_app()
  460. status = app.remove_friend()
  461. self.log.debug('[Unblock]' + str(user))
  462. return status
  463. def IRCdeploy(self, user, host, port, chan):
  464. app = self.get_app()
  465. AnonBot = app.IRCdeploy(user, host, port, chan)
  466. return AnonBot