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_post(post_id): graph = init_facebook_client(token) comments = [] url = f'{post_id}/comments' params = {'fields': 'id,message,is_hidden'} while True: comments_data = graph.get_object(id=url, **params) visible_comments = [comment for comment in comments_data.get('data', []) if not comment.get('is_hidden', False)] comments.extend(visible_comments) if 'paging' in comments_data and 'next' in comments_data['paging']: url = comments_data['paging']['next'] params = {} # The 'next' URL already includes access token and fields 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): 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 = [] 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 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'] }) 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): 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,message" } 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 = {} 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) 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): 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