new_ads_obnova / func_facebook.py
Uniaff's picture
Update func_facebook.py
f2d0404 verified
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