Spaces:
Paused
Paused
import facebook | |
import requests | |
from func_ai import analyze_sentiment | |
GRAPH_API_URL = 'https://graph.facebook.com/v20.0' | |
def hide_negative_comments(token): | |
def init_facebook_client(token): | |
print("Инициализация клиента Facebook.") | |
return facebook.GraphAPI(access_token=token) | |
def get_facebook_posts(): | |
print("Получение постов.") | |
params = { | |
'include_inline_create': 'true', | |
"limit": 30 | |
} | |
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', []) | |
print(f"Найдено {len(user_posts)} пользовательских постов.") | |
try: | |
ads_posts_data = graph.get_object('me/ads_posts', **params) | |
ads_posts = ads_posts_data.get('data', []) | |
print(f"Найдено {len(ads_posts)} рекламных постов.") | |
except facebook.GraphAPIError as e: | |
print(f"Ошибка при получении рекламных постов: {e}") | |
ads_posts = [] | |
all_posts = user_posts + ads_posts | |
unique_posts_dict = {post['id']: post for post in all_posts} | |
unique_posts = list(unique_posts_dict.values()) | |
print(f"Всего уникальных постов: {len(unique_posts)}.") | |
return unique_posts | |
def get_comments_for_post(post_id): | |
print(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: | |
print(f"Ошибка при получении комментариев для поста {post_id}: {e}") | |
break | |
visible_comments = [comment for comment in comments_data.get('data', []) if not comment.get('is_hidden', False)] | |
comments.extend(visible_comments) | |
print(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 filter_comments(comments, sentiments): | |
print("Фильтрация негативных комментариев.") | |
negative_comments = [] | |
for comment, sentiment in zip(comments, sentiments): | |
if sentiment['label'].lower() == 'negative': | |
print(f"Негативный комментарий найден: {comment['message']}") | |
negative_comments.append(comment) | |
return negative_comments | |
def hide_comment(comment_id): | |
print(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: | |
print(f"Ошибка при скрытии комментария {comment_id}: {e}") | |
return False | |
posts = get_facebook_posts() | |
if not posts: | |
print("Нет постов для обработки.") | |
return [] | |
hidden_comments_per_post = [] | |
processed_comment_ids = set() # Отслеживание обработанных комментариев | |
for post in posts: | |
post_id = post['id'] | |
post_message = post.get('message', '') | |
comments = get_comments_for_post(post_id) | |
if not comments: | |
print(f"Нет комментариев для поста {post_id}.") | |
continue | |
hidden_comments = [] | |
comments_text = [] | |
comments_to_process = [] | |
for comment in comments: | |
comment_id = comment['id'] | |
if comment_id in processed_comment_ids: | |
print(f"Комментарий {comment_id} уже обработан. Пропуск.") | |
continue | |
processed_comment_ids.add(comment_id) | |
comments_text.append(comment['message']) | |
comments_to_process.append(comment) | |
if not comments_to_process: | |
continue | |
sentiments = analyze_sentiment(comments_text) | |
negative_comments = filter_comments(comments_to_process, sentiments) | |
for comment in negative_comments: | |
if hide_comment(comment['id']): | |
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 get_page_id(page_access_token): | |
print("Получение ID страницы.") | |
url = f"{GRAPH_API_URL}/me" | |
params = { | |
"access_token": page_access_token, | |
"fields": "id,name" | |
} | |
response = requests.get(url, params=params) | |
data = response.json() | |
if 'error' in data: | |
print(f"Ошибка при получении ID страницы: {data['error']}") | |
return None | |
return data.get("id") | |
def get_posts(page_id, page_access_token): | |
print(f"Получение постов для страницы {page_id}.") | |
url = f"{GRAPH_API_URL}/{page_id}/posts" | |
url_ads = f"{GRAPH_API_URL}/{page_id}/ads_posts?include_inline_create=true" | |
params = { | |
"access_token": page_access_token, | |
"fields": "id,message", | |
"limit": 30 | |
} | |
posts = [] | |
while True: | |
response = requests.get(url, params=params) | |
data = response.json() | |
if 'error' in data: | |
print(f"Ошибка при получении постов: {data['error']}") | |
break | |
posts.extend(data.get("data", [])) | |
print(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: | |
print(f"Ошибка при получении рекламных постов: {data_ads['error']}") | |
break | |
posts.extend(data_ads.get("data", [])) | |
print(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): | |
print(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: | |
print(f"Ошибка при получении комментариев к посту {post_id}: {data['error']}") | |
break | |
comments.extend(data.get("data", [])) | |
print(f"Найдено {len(data.get('data', []))} комментариев.") | |
if 'paging' in data and 'next' in data['paging']: | |
url = data['paging']['next'] | |
params = {} | |
else: | |
break | |
return comments | |
def has_page_replied(comment_id, page_id, page_access_token): | |
print(f"Проверка ответа на комментарий {comment_id}.") | |
url = f"{GRAPH_API_URL}/{comment_id}/comments" | |
params = { | |
"access_token": page_access_token, | |
"fields": "from{id},message", | |
} | |
while True: | |
try: | |
response = requests.get(url, params=params) | |
if response.status_code != 200: | |
print(f"Ошибка при запросе API: {response.status_code} - {response.text}") | |
return False | |
data = response.json() | |
if 'error' in data: | |
print(f"Ошибка при получении ответов на комментарий {comment_id}: {data['error']}") | |
return False | |
for reply in data.get("data", []): | |
reply_from = reply.get('from', {}) | |
reply_from_id = reply_from.get('id') | |
reply_message = reply.get('message', '') | |
print(f"Найдена реплика от пользователя: {reply_from_id}, сообщение: {reply_message}") | |
if reply_from_id == page_id: | |
print(f"Страница {page_id} уже ответила на комментарий {comment_id}.") | |
return True | |
if 'paging' in data and 'next' in data['paging']: | |
url = data['paging']['next'] | |
params = {} | |
else: | |
break | |
except requests.exceptions.RequestException as e: | |
print(f"Ошибка при выполнении запроса: {e}") | |
return False | |
print(f"Страница {page_id} не ответила на комментарий {comment_id}.") | |
return False | |
def get_unanswered_comments(page_access_token): | |
page_id = get_page_id(page_access_token) | |
if not page_id: | |
return [] | |
print(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', '') | |
print(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'] | |
print(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): | |
print(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: | |
print(f"Ответ успешно отправлен на комментарий {comment_id}.") | |
return True | |
else: | |
print(f"Ошибка при отправке ответа: {response.text}") | |
return False |