AuM implements ICapAccount

This commit is contained in:
Romain Bignon 2010-10-26 20:59:24 +02:00
commit e709f40b8a
2 changed files with 103 additions and 58 deletions

View file

@ -26,8 +26,10 @@ from weboob.capabilities.chat import ICapChat
from weboob.capabilities.messages import ICapMessages, ICapMessagesPost, Message, Thread
from weboob.capabilities.dating import ICapDating, StatusField
from weboob.capabilities.contact import ICapContact, Contact, ProfileNode
from weboob.capabilities.account import ICapAccount, Account
from weboob.tools.backend import BaseBackend
from weboob.tools.browser import BrowserUnavailable
from weboob.tools.value import Value, ValuesDict, ValueBool
from .captcha import CaptchaError
from .antispam import AntiSpam
@ -40,22 +42,16 @@ from .optim.visibility import Visibility
__all__ = ['AuMBackend']
class AuMBackend(BaseBackend, ICapMessages, ICapMessagesPost, ICapDating, ICapChat, ICapContact):
class AuMBackend(BaseBackend, ICapMessages, ICapMessagesPost, ICapDating, ICapChat, ICapContact, ICapAccount):
NAME = 'aum'
MAINTAINER = 'Romain Bignon'
EMAIL = 'romain@weboob.org'
VERSION = '0.3'
LICENSE = 'GPLv3'
DESCRIPTION = u"“Adopte un mec” french dating website"
CONFIG = {'username': BaseBackend.ConfigField(description='Username on website'),
'password': BaseBackend.ConfigField(description='Password of account', is_masked=True),
'register': BaseBackend.ConfigField(description='Register as new account?', default=False),
'sex': BaseBackend.ConfigField(description='Sex of new the account owner', default='m',
choices=('m', 'f')),
'age': BaseBackend.ConfigField(description='Age of new the account owner', default=25),
'godfather': BaseBackend.ConfigField(description='Godfather of new the account owner', default=''),
'antispam': BaseBackend.ConfigField(description='Enable anti-spam', default=False),
}
CONFIG = ValuesDict(Value('username', label='Username'),
Value('password', label='Password', masked=True),
ValueBool('antispam', label='Enable anti-spam', default=False))
STORAGE = {'profiles_walker': {'viewed': []},
'sluts': {},
}
@ -71,27 +67,7 @@ class AuMBackend(BaseBackend, ICapMessages, ICapMessagesPost, ICapDating, ICapCh
self.antispam = None
def create_default_browser(self):
if self.config['register']:
browser = None
birthday = datetime.datetime.now() - datetime.timedelta(int(self.config['age']) * 365)
while not browser:
try:
browser = self.create_browser(self.config['username'])
browser.register(password= self.config['password'],
sex= 0 if self.config['sex'] == 'm' else 1,
birthday_d= birthday.day,
birthday_m= birthday.month,
birthday_y= birthday.year,
zipcode= 75001,
country= 'fr',
godfather= self.config['godfather'])
except CaptchaError:
debug('Unable to resolve captcha. Retrying...')
browser = None
browser.password = self.config['password']
return browser
else:
return self.create_browser(self.config['username'], self.config['password'])
return self.create_browser(self.config['username'], self.config['password'])
def report_spam(self, id, suppr_id=None):
if suppr_id:
@ -99,6 +75,12 @@ class AuMBackend(BaseBackend, ICapMessages, ICapMessagesPost, ICapDating, ICapCh
self.browser.report_fake(id)
pass
# ---- ICapDating methods ---------------------
def init_optimizations(self):
self.OPTIM_PROFILE_WALKER = ProfilesWalker(self.weboob.scheduler, self.storage, self.browser)
self.OPTIM_VISIBILITY = Visibility(self.weboob.scheduler, self.browser)
def get_status(self):
with self.browser:
try:
@ -110,6 +92,11 @@ class AuMBackend(BaseBackend, ICapMessages, ICapMessagesPost, ICapDating, ICapCh
except AdopteWait:
return (StatusField('notice', '', u'<h3>You are currently waiting 1am to be able to connect with this account</h3>', StatusField.FIELD_HTML|StatusField.FIELD_TEXT))
# ---- ICapMessages methods ---------------------
def fill_thread(self, thread, fields):
return self.get_thread(thread)
def iter_threads(self):
with self.browser:
contacts = self.browser.get_threads_list()
@ -281,10 +268,27 @@ class AuMBackend(BaseBackend, ICapMessages, ICapMessagesPost, ICapDating, ICapCh
slut['lastmsg'] = slut['lastmsg'].replace(tzinfo=tz.tzutc())
return slut
# ---- ICapMessagesPost methods ---------------------
def post_message(self, message):
with self.browser:
self.browser.post_mail(message.thread.id, message.content)
# ---- ICapContact methods ---------------------
def fill_contact(self, contact, fields):
if 'profile' in fields:
contact = self.get_contact(contact)
if contact and 'photos' in fields:
for name, photo in contact.photos.iteritems():
with self.browser:
if photo.url:
data = self.browser.openurl(photo.url).read()
contact.set_photo(name, data=data)
if photo.thumbnail_url:
data = self.browser.openurl(photo.thumbnail_url).read()
contact.set_photo(name, thumbnail_data=data)
def get_contact(self, contact):
with self.browser:
if isinstance(contact, Contact):
@ -326,10 +330,6 @@ class AuMBackend(BaseBackend, ICapMessages, ICapMessagesPost, ICapDating, ICapCh
return contact
def init_optimizations(self):
self.OPTIM_PROFILE_WALKER = ProfilesWalker(self.weboob.scheduler, self.storage, self.browser)
self.OPTIM_VISIBILITY = Visibility(self.weboob.scheduler, self.browser)
def iter_contacts(self, status=Contact.STATUS_ALL, ids=None):
with self.browser:
for contact in self.browser.iter_contacts():
@ -352,6 +352,8 @@ class AuMBackend(BaseBackend, ICapMessages, ICapMessagesPost, ICapDating, ICapCh
c.set_photo(contact['cover'].split('/')[-1].replace('thumb0_', 'image'), thumbnail_url=contact['cover'])
yield c
# ---- ICapChat methods ---------------------
def iter_chat_messages(self, _id=None):
with self.browser:
return self.browser.iter_chat_messages(_id)
@ -363,21 +365,56 @@ class AuMBackend(BaseBackend, ICapMessages, ICapMessagesPost, ICapDating, ICapCh
#def start_chat_polling(self):
#self._profile_walker = ProfilesWalker(self.weboob.scheduler, self.storage, self.browser)
def fill_contact(self, contact, fields):
if 'profile' in fields:
contact = self.get_contact(contact)
if contact and 'photos' in fields:
for name, photo in contact.photos.iteritems():
with self.browser:
if photo.url:
data = self.browser.openurl(photo.url).read()
contact.set_photo(name, data=data)
if photo.thumbnail_url:
data = self.browser.openurl(photo.thumbnail_url).read()
contact.set_photo(name, thumbnail_data=data)
# ---- ICapAccount methods ---------------------
def fill_thread(self, thread, fields):
return self.get_thread(thread)
ACCOUNT_REGISTER_PROPERTIES = ValuesDict(
Value('username', label='Email address', regexp='^[^ ]+@[^ ]+\.[^ ]+$'),
Value('password', label='Password', regexp='^[^ ]+$', masked=True),
Value('sex', label='Sex', choices={'0': 'Male', '1': 'Female'}),
Value('birthday', label='Birthday', regexp='^\d+/\d+/\d+$'),
Value('zipcode', label='Zipcode'),
Value('country', label='Country', choices={'fr': 'France', 'be': 'Belgique', 'ch': 'Suisse', 'ca': 'Canada'}, default='fr'),
Value('godfather',label='Godfather', regexp='^\d*$', default=''),
)
@classmethod
def register_account(klass, account):
"""
Register an account on website
This is a static method, it would be called even if the backend is
instancied.
@param account an Account object which describe the account to create
"""
browser = None
bday, bmonth, byear = account.properties['birthday'].value.split('/', 2)
while not browser:
try:
browser = klass.BROWSER(account.properties['username'].value)
browser.register(password= account.properties['password'].value,
sex= int(account.properties['sex'].value),
birthday_d= int(bday),
birthday_m= int(bmonth),
birthday_y= int(byear),
zipcode= account.properties['zipcode'].value,
country= account.properties['country'].value,
godfather= account.properties['godfather'].value)
except CaptchaError:
debug('Unable to resolve captcha. Retrying...')
browser = None
def get_account(self):
"""
Get the current account.
"""
raise NotImplementedError()
def update_account(self, account):
"""
Update the current account.
"""
raise NotImplementedError()
OBJECTS = {Thread: fill_thread,
Contact: fill_contact}

View file

@ -18,7 +18,9 @@
import re
from weboob.tools.mech import ClientForm
from weboob.tools.browser import BrowserIncorrectPassword
from weboob.capabilities.account import AccountRegisterError
from .base import PageBase
from ..captcha import Captcha
@ -31,9 +33,6 @@ class LoginPage(PageBase):
self.browser.submit() # submit current form
class RegisterError(Exception):
pass
class RegisterPage(PageBase):
def on_loaded(self):
display_errors = False
@ -52,7 +51,7 @@ class RegisterPage(PageBase):
for m in re.finditer('"(\w+)": "(.*)",', child.data):
errors.append(m.group(2))
raise RegisterError(u'Unable to register account: %s' % ', '.join(errors))
raise AccountRegisterError(u'Unable to register account: %s' % ', '.join(errors))
def register(self, password, sex, birthday_d, birthday_m, birthday_y, zipcode, country):
"""
@ -77,11 +76,20 @@ Form name=register (#1)
self.browser.select_form(name='register')
self.browser.set_all_readonly(False)
self.browser['sex'] = [str(sex)]
self.browser['birthday0'] = [str(birthday_d)]
self.browser['birthday1'] = [str(birthday_m)]
self.browser['birthday2'] = [str(birthday_y)]
self.browser['country'] = [str(country)]
try:
self.browser['sex'] = [str(sex)]
except ClientForm.ItemNotFoundError:
raise AccountRegisterError('Please give a right sex! (1 or 0)')
try:
self.browser['birthday0'] = [str(birthday_d)]
self.browser['birthday1'] = [str(birthday_m)]
self.browser['birthday2'] = [str(birthday_y)]
except ClientForm.ItemNotFoundError:
raise AccountRegisterError('Please give a right birthday date!')
try:
self.browser['country'] = [str(country)]
except ClientForm.ItemNotFoundError:
raise AccountRegisterError('Please select a right country!')
self.browser['zip'] = str(zipcode)
self.browser['email'] = self.browser.username
self.browser['pass'] = password