add a profile walker to automatically send won challenges

This commit is contained in:
Romain Bignon 2014-10-18 15:26:44 +02:00
commit 66c27d47c5
2 changed files with 89 additions and 3 deletions

View file

@ -21,6 +21,7 @@
import re import re
from weboob.browser import DomainBrowser from weboob.browser import DomainBrowser
from weboob.browser.exceptions import ClientError
from weboob.browser.pages import HTMLPage from weboob.browser.pages import HTMLPage
from weboob.browser.profiles import Profile from weboob.browser.profiles import Profile
from weboob.exceptions import BrowserIncorrectPassword from weboob.exceptions import BrowserIncorrectPassword
@ -30,6 +31,9 @@ from weboob.tools.json import json
__all__ = ['PlayMeBrowser', 'FacebookBrowser'] __all__ = ['PlayMeBrowser', 'FacebookBrowser']
class NoCredits(Exception): pass
class FacebookBrowser(DomainBrowser): class FacebookBrowser(DomainBrowser):
BASEURL = 'https://graph.facebook.com' BASEURL = 'https://graph.facebook.com'
@ -89,7 +93,7 @@ class PlayMeBrowser(DomainBrowser):
self.my_name = me['name'] self.my_name = me['name']
def get_threads(self): def get_threads(self):
return self.request('/users/%s/contacts' % self.my_id) return reversed(self.request('/users/%s/contacts' % self.my_id))
def get_thread_messages(self, contact_id): def get_thread_messages(self, contact_id):
return self.request('/messages/%s' % contact_id) return self.request('/messages/%s' % contact_id)
@ -106,3 +110,30 @@ class PlayMeBrowser(DomainBrowser):
r = self.location(*args, **kwargs) r = self.location(*args, **kwargs)
return json.loads(r.content) return json.loads(r.content)
def find_users(self, lat, lon):
r = self.request('/users/?lat=%s&lon=%s&type=full' % (lat, lon))
return r['pending'] + r['history']
def get_theme(self):
r = self.request('/questions')
for t in r:
if t['theme']['is_vip']:
continue
return t
def challenge(self, user_id):
try:
r = self.request('/users/%s/challenge/%s' % (self.my_id, user_id))
except ClientError as e:
r = json.loads(e.response.content)
raise NoCredits(r['credits']['next_restore_in_seconds'])
t = self.get_theme()
data = {}
data['theme'] = {'id': t['theme']['id'], 'is_vip': 0}
data['questions'] = [q['id'] for q in t['questions']]
data['answers'] = [{'duration': 1000, 'result': 1} for q in t['questions']]
self.request('/users/%s/challenge/%s' % (self.my_id, user_id), data=data)

View file

@ -21,17 +21,66 @@
import datetime import datetime
from weboob.capabilities.messages import CapMessages, CapMessagesPost, Thread, Message from weboob.capabilities.messages import CapMessages, CapMessagesPost, Thread, Message
from weboob.capabilities.dating import CapDating from weboob.capabilities.dating import CapDating, Optimization
from weboob.tools.backend import Module, BackendConfig from weboob.tools.backend import Module, BackendConfig
from weboob.tools.value import Value, ValueBackendPassword from weboob.tools.value import Value, ValueBackendPassword
from weboob.tools.date import local2utc from weboob.tools.date import local2utc
from weboob.tools.log import getLogger
from .browser import PlayMeBrowser, FacebookBrowser from .browser import PlayMeBrowser, FacebookBrowser, NoCredits
__all__ = ['PlayMeModule'] __all__ = ['PlayMeModule']
class ProfilesWalker(Optimization):
def __init__(self, sched, storage, browser):
self._sched = sched
self._storage = storage
self._browser = browser
self._logger = getLogger('walker', browser.logger)
self._view_cron = None
def start(self):
self._view_cron = self._sched.schedule(1, self.view_profile)
return True
def stop(self):
self._sched.cancel(self._view_cron)
self._view_cron = None
return True
def set_config(self, params):
pass
def is_running(self):
return self._view_cron is not None
def view_profile(self):
delay = 900
try:
challenged = self._storage.get('challenged', default=[])
for user in self._browser.find_users(48.883989, 2.367168):
if user['id'] in challenged:
continue
try:
self._browser.challenge(user['id'])
except NoCredits as e:
delay = int(str(e))
self._logger.info('No more credits (next try in %d minutes)' % (delay/60))
else:
self._logger.info('Challenged %s' % user['name'])
challenged.append(user['id'])
self._storage.set('challenged', challenged)
self._storage.save()
break
finally:
if self._view_cron is not None:
self._view_cron = self._sched.schedule(delay, self.view_profile)
class PlayMeModule(Module, CapMessages, CapMessagesPost, CapDating): class PlayMeModule(Module, CapMessages, CapMessagesPost, CapDating):
NAME = 'playme' NAME = 'playme'
DESCRIPTION = u'PlayMe dating mobile application' DESCRIPTION = u'PlayMe dating mobile application'
@ -44,6 +93,7 @@ class PlayMeModule(Module, CapMessages, CapMessagesPost, CapDating):
BROWSER = PlayMeBrowser BROWSER = PlayMeBrowser
STORAGE = {'contacts': {}, STORAGE = {'contacts': {},
'challenged': [],
} }
def create_default_browser(self): def create_default_browser(self):
@ -52,6 +102,11 @@ class PlayMeModule(Module, CapMessages, CapMessagesPost, CapDating):
self.config['password'].get()) self.config['password'].get())
return PlayMeBrowser(facebook) return PlayMeBrowser(facebook)
# ---- CapDating methods -----------------------
def init_optimizations(self):
self.add_optimization('PROFILE_WALKER', ProfilesWalker(self.weboob.scheduler, self.storage, self.browser))
# ---- CapMessages methods --------------------- # ---- CapMessages methods ---------------------
def fill_thread(self, thread, fields): def fill_thread(self, thread, fields):