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): return facebook.GraphAPI(access_token=token) def get_facebook_posts(): graph = init_facebook_client(token) posts_data = graph.get_object(id='me/posts', fields='id,message,created_time') return posts_data.get('data', []) def get_comments_for_all_posts(posts): all_comments = [] graph = init_facebook_client(token) for post in posts: comments_data = graph.get_object(id=f'{post["id"]}/comments', fields='message,created_time,id,is_hidden') visible_comments = [comment for comment in comments_data.get('data', []) if not comment.get('is_hidden', False)] all_comments.extend(visible_comments) return all_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): 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 [] comments = get_comments_for_all_posts(posts) if not comments: print("Нет комментариев для обработки.") return [] comments_text = [comment['message'] for comment in comments] sentiments = analyze_sentiment(comments_text) negative_comments = filter_comments(comments, sentiments) hidden_comments = [] for comment in negative_comments: if hide_comment(comment['id']): hidden_comments.append({ 'id': comment['id'], 'message': comment['message'] }) return hidden_comments def get_facebook_comments(post_id, ACCESS_TOKEN): print(f"Получаем комментарии для поста: {post_id}") url = f"{GRAPH_API_URL}/{post_id}/comments" params = { 'access_token': ACCESS_TOKEN, 'filter': 'stream' } response = requests.get(url, params=params) if response.status_code == 200: print("Комментарии успешно получены.") return response.json().get('data', []) else: print(f"Ошибка при получении комментариев: {response.text}") return [] def get_page_id(page_access_token): 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): url = f"{GRAPH_API_URL}/{page_id}/posts" params = { "access_token": page_access_token, "fields": "id" # Максимальное количество постов за запрос } 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", [])) if 'paging' in data and 'next' in data['paging']: url = data['paging']['next'] params = {} # Следующие запросы уже содержат все параметры в URL else: break return posts def get_comments(post_id, page_access_token): 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", [])) if 'paging' in data and 'next' in data['paging']: url = data['paging']['next'] params = {} # Следующие запросы уже содержат все параметры в URL else: break return comments def has_page_replied(comment_id, page_id, page_access_token): url = f"{GRAPH_API_URL}/{comment_id}/comments" params = { "access_token": page_access_token, "fields": "from{id}", } while True: response = requests.get(url, params=params) data = response.json() if 'error' in data: print(f"Ошибка при получении ответов на комментарий {comment_id}: {data['error']}") return False for reply in data.get("data", []): if reply['from']['id'] == page_id: return True if 'paging' in data and 'next' in data['paging']: url = data['paging']['next'] params = {} else: break 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) unanswered_comments = [] for post in posts: post_id = post['id'] print(f"Обработка поста: {post_id}") comments = get_comments(post_id, page_access_token) 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) return unanswered_comments def reply_comment(comment_id, message, token): 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