import logging import requests from odoo import models, fields, _ from odoo.tools import config from datetime import datetime, timedelta _logger = logging.getLogger(__name__) class CRMLeadCronJob(models.Model): _inherit = "crm.lead" _facebook_base_url = "https://graph.facebook.com" _config: dict = config.misc.get('crm_sync_data') # ------------------------------------------------------------------------- # CRON # ------------------------------------------------------------------------- def _auto_get_facebook_lead_entries(self): """ This method is called from a cron job. """ _logger.info("RUNNING get lead entries from facebook") check_valid_token = self._check_expire_facebook_token() if not check_valid_token: _logger.info("Lỗi: Get Facebook lead, token không hợp lệ") return data = self._get_data_facebook_lead() if data is None: return print(data) # moves = self.search([ # ('state', '=', 'draft'), # ('date', '<=', fields.Date.context_today(self)), # ('auto_post', '!=', 'no'), # ('to_check', '=', False), # ], limit=100) # # try: # try posting in batch # with self.env.cr.savepoint(): # moves._post() # except UserError: # if at least one move cannot be posted, handle moves one by one # for move in moves: # try: # with self.env.cr.savepoint(): # move._post() # except UserError as e: # move.to_check = True # msg = _('The move could not be posted for the following reason: %(error_message)s', error_message=e) # move.message_post(body=msg, message_type='comment') # # if len(moves) == 100: # assumes there are more whenever search hits limit # self.env.ref('account.ir_cron_auto_post_draft_entry')._trigger() # ------------------------------------------------------------------------- # HELPER METHODS # ------------------------------------------------------------------------- def _refresh_facebook_token(self): url = f"{self._facebook_base_url}/v14.0/oauth/access_token" params = { 'grant_type': 'fb_exchange_token', 'client_id': self._config.get("facebook_app_id"), 'client_secret': self._config.get("facebook_app_secret"), 'fb_exchange_token': self._config.get("facebook_access_token"), } response = requests.get(url, params=params) if response.status_code == 200: config.misc['crm_sync_data']['facebook_access_token'] = response.json().get('access_token') config.save() return True _logger.warning("Gọi API refresh facebook token lỗi") _logger.warning(response.text) return False def _check_expire_facebook_token(self): url = f"{self._facebook_base_url}/v14.0/debug_token" params = { 'access_token': self._config.get("facebook_access_token"), 'input_token': self._config.get("facebook_access_token") } response = requests.get(url, params=params) if response.status_code == 200: token_expires_at = datetime.fromtimestamp(response.json().get('data').get('expires_at')) print("token_expires_at =", token_expires_at) if token_expires_at - timedelta(days=7) < datetime.now(): self._refresh_facebook_token() return True _logger.warning("Lỗi: facebook access token đã hết hạn") _logger.warning(response.text) return False def _get_data_facebook_lead(self): url = f"{self._facebook_base_url}/v14.0/{self._config.get('facebook_page_id')}/leads" params = {'access_token': self._config.get("facebook_access_token")} response = requests.get(url, params=params) if response.status_code == 200: return response.json() _logger.info("Lỗi: Get Facebook lead, không lấy được data lead") return None