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 |