new_ads_obnova / func_facebook.py
Uniaff's picture
Update func_facebook.py
832a14c verified
raw
history blame
10.5 kB
# func_facebook.py
import facebook
import requests
from func_ai import analyze_sentiment, classify_comment, retrieve_from_vdb
from datetime import datetime
GRAPH_API_URL = 'https://graph.facebook.com/v20.0'
def log_message(message):
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(f"[{timestamp}] {message}")
def init_facebook_client(token):
log_message("Инициализация клиента Facebook.")
return facebook.GraphAPI(access_token=token)
def get_page_id(page_access_token):
log_message("Получение ID страницы.")
url = f"{GRAPH_API_URL}/me"
params = {
"access_token": page_access_token,
"fields": "id,name,accounts"
}
response = requests.get(url, params=params)
data = response.json()
if 'error' in data:
log_message(f"Ошибка при получении ID страницы: {data['error']}")
return None
accounts = data.get("accounts", {}).get("data", [])
if not accounts:
log_message("Нет доступных страниц для управления.")
return None
# Предполагаем, что первая страница является целевой; при необходимости измените логику
return accounts[0].get("id")
def get_facebook_posts(token):
log_message("Получение постов.")
params = {
'include_inline_create': 'true'
}
graph = init_facebook_client(token)
user_posts_data = graph.get_object(id='me/posts', fields='id,message,created_time')
user_posts = user_posts_data.get('data', [])
log_message(f"Найдено {len(user_posts)} пользовательских постов.")
try:
ads_posts_data = graph.get_object('me/ads_posts', **params)
ads_posts = ads_posts_data.get('data', [])
log_message(f"Найдено {len(ads_posts)} рекламных постов.")
except facebook.GraphAPIError as e:
log_message(f"Ошибка при получении рекламных постов: {e}")
ads_posts = []
all_posts = user_posts + ads_posts
log_message(f"Всего постов: {len(all_posts)}.")
return all_posts
def get_comments_for_post(post_id, token):
log_message(f"Получение комментариев для поста {post_id}.")
graph = init_facebook_client(token)
comments = []
url = f'{post_id}/comments'
params = {'fields': 'id,message,is_hidden'}
while True:
try:
comments_data = graph.get_object(id=url, **params)
except facebook.GraphAPIError as e:
log_message(f"Ошибка при получении комментариев: {e}")
break
visible_comments = [comment for comment in comments_data.get('data', []) if not comment.get('is_hidden', False)]
comments.extend(visible_comments)
log_message(f"Найдено {len(visible_comments)} видимых комментариев для поста {post_id}.")
if 'paging' in comments_data and 'next' in comments_data['paging']:
url = comments_data['paging']['next']
params = {}
else:
break
return comments
def has_page_replied(comment_id, page_id, page_access_token):
log_message(f"Проверка ответа на комментарий {comment_id}.")
url = f"{GRAPH_API_URL}/{comment_id}/comments"
params = {
"access_token": page_access_token,
"fields": "from{id,name}",
}
while True:
response = requests.get(url, params=params)
data = response.json()
if 'error' in data:
log_message(f"Ошибка при получении ответов на комментарий {comment_id}: {data['error']}")
return False
for reply in data.get("data", []):
from_id = reply.get('from', {}).get('id')
from_name = reply.get('from', {}).get('name')
log_message(f"Найден ответ от пользователя ID: {from_id}, Name: {from_name}")
if from_id == page_id:
log_message(f"Страница {page_id} уже ответила на комментарий {comment_id}.")
return True
if 'paging' in data and 'next' in data['paging']:
url = data['paging']['next']
params = {}
else:
break
return False
def get_posts(page_id, page_access_token):
log_message(f"Получение постов для страницы {page_id}.")
url = f"{GRAPH_API_URL}/{page_id}/posts"
url_ads = f"{GRAPH_API_URL}/{page_id}/ads_posts"
params = {
"access_token": page_access_token,
"fields": "id,message"
}
posts = []
while True:
response = requests.get(url, params=params)
data = response.json()
if 'error' in data:
log_message(f"Ошибка при получении постов: {data['error']}")
break
posts.extend(data.get("data", []))
log_message(f"Получено {len(data.get('data', []))} постов.")
# Получение рекламных постов
response_ads = requests.get(url_ads, params={"access_token": page_access_token, "fields": "id,message"})
data_ads = response_ads.json()
if 'error' in data_ads:
log_message(f"Ошибка при получении рекламных постов: {data_ads['error']}")
break
posts.extend(data_ads.get("data", []))
log_message(f"Получено {len(data_ads.get('data', []))} рекламных постов.")
if 'paging' in data and 'next' in data['paging']:
url = data['paging']['next']
params = {}
else:
break
return posts
def get_comments(post_id, page_access_token):
log_message(f"Получение комментариев для поста {post_id}.")
url = f"{GRAPH_API_URL}/{post_id}/comments"
params = {
"access_token": page_access_token,
"fields": "id,from,message,is_hidden",
}
comments = []
while True:
response = requests.get(url, params=params)
data = response.json()
if 'error' in data:
log_message(f"Ошибка при получении комментариев к посту {post_id}: {data['error']}")
break
comments.extend(data.get("data", []))
log_message(f"Найдено {len(data.get('data', []))} комментариев.")
if 'paging' in data and 'next' in data['paging']:
url = data['paging']['next']
params = {}
else:
break
return comments
def get_unanswered_comments(page_access_token):
page_id = get_page_id(page_access_token)
if not page_id:
return []
log_message(f"ID Страницы: {page_id}")
posts = get_posts(page_id, page_access_token)
posts_with_unanswered_comments = []
for post in posts:
post_id = post['id']
post_message = post.get('message', '')
log_message(f"Обработка поста: {post_id}")
comments = get_comments(post_id, page_access_token)
unanswered_comments = []
for comment in comments:
if comment.get('is_hidden', False):
continue
comment_id = comment['id']
log_message(f"Проверка комментария: {comment_id}")
if not has_page_replied(comment_id, page_id, page_access_token):
unanswered_comments.append(comment)
if unanswered_comments:
posts_with_unanswered_comments.append({
'post_id': post_id,
'post_message': post_message,
'unanswered_comments': unanswered_comments
})
return posts_with_unanswered_comments
def reply_comment(comment_id, message, token):
log_message(f"Отправка ответа на комментарий {comment_id}.")
url = f"{GRAPH_API_URL}/{comment_id}/comments"
params = {
'access_token': token,
'message': message
}
response = requests.post(url, params=params)
if response.status_code == 200:
log_message(f"Ответ успешно отправлен на комментарий {comment_id}.")
return True
else:
log_message(f"Ошибка при отправке ответа: {response.text}")
return False
def hide_negative_comments(token):
log_message("Начинаем процесс скрытия отрицательных комментариев.")
posts = get_facebook_posts(token)
if not posts:
log_message("Нет постов для обработки.")
return []
hidden_comments_per_post = []
for post in posts:
post_id = post['id']
post_message = post.get('message', '')
comments = get_comments_for_post(post_id, token)
if not comments:
log_message(f"Нет комментариев для поста {post_id}.")
continue
comments_text = [comment['message'] for comment in comments]
sentiments = analyze_sentiment(comments_text)
negative_comments = [comment for comment, sentiment in zip(comments, sentiments) if sentiment['label'].lower() == 'negative']
hidden_comments = []
for comment in negative_comments:
if hide_comment(comment['id'], token):
hidden_comments.append({
'id': comment['id'],
'message': comment['message']
})
if hidden_comments:
hidden_comments_per_post.append({
'post_id': post_id,
'post_message': post_message,
'hidden_comments': hidden_comments
})
return hidden_comments_per_post
def hide_comment(comment_id, token):
log_message(f"Скрытие комментария {comment_id}.")
graph = init_facebook_client(token)
try:
graph.request(f'{comment_id}', post_args={'is_hidden': True}, method='POST')
return True
except facebook.GraphAPIError as e:
log_message(f"Ошибка при скрытии комментария {comment_id}: {e}")
return False