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