Spaces:
Paused
Paused
Create func_facebook
Browse files- func_facebook +208 -0
func_facebook
ADDED
@@ -0,0 +1,208 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import facebook
|
2 |
+
import requests
|
3 |
+
|
4 |
+
from func_ai import analyze_sentiment
|
5 |
+
|
6 |
+
GRAPH_API_URL = 'https://graph.facebook.com/v20.0'
|
7 |
+
|
8 |
+
|
9 |
+
def hide_negative_comments(token):
|
10 |
+
def init_facebook_client(token):
|
11 |
+
return facebook.GraphAPI(access_token=token)
|
12 |
+
|
13 |
+
def get_facebook_posts():
|
14 |
+
graph = init_facebook_client(token)
|
15 |
+
posts_data = graph.get_object(id='me/posts', fields='id,message,created_time')
|
16 |
+
return posts_data.get('data', [])
|
17 |
+
|
18 |
+
def get_comments_for_all_posts(posts):
|
19 |
+
all_comments = []
|
20 |
+
graph = init_facebook_client(token)
|
21 |
+
for post in posts:
|
22 |
+
comments_data = graph.get_object(id=f'{post["id"]}/comments', fields='message,created_time,id,is_hidden')
|
23 |
+
visible_comments = [comment for comment in comments_data.get('data', []) if
|
24 |
+
not comment.get('is_hidden', False)]
|
25 |
+
all_comments.extend(visible_comments)
|
26 |
+
return all_comments
|
27 |
+
|
28 |
+
def filter_comments(comments, sentiments):
|
29 |
+
print("Фильтруем негативные комментарии.")
|
30 |
+
negative_comments = []
|
31 |
+
for comment, sentiment in zip(comments, sentiments):
|
32 |
+
if sentiment['label'].lower() == 'negative':
|
33 |
+
print(f"Найден негативный комментарий: {comment['message']}")
|
34 |
+
negative_comments.append(comment)
|
35 |
+
return negative_comments
|
36 |
+
|
37 |
+
def hide_comment(comment_id):
|
38 |
+
graph = init_facebook_client(token)
|
39 |
+
try:
|
40 |
+
graph.request(f'{comment_id}', post_args={'is_hidden': True}, method='POST')
|
41 |
+
return True
|
42 |
+
except facebook.GraphAPIError as e:
|
43 |
+
print(f"Ошибка при скрытии комментария {comment_id}: {e}")
|
44 |
+
return False
|
45 |
+
|
46 |
+
posts = get_facebook_posts()
|
47 |
+
if not posts:
|
48 |
+
print("Нет постов для обработки.")
|
49 |
+
return []
|
50 |
+
|
51 |
+
comments = get_comments_for_all_posts(posts)
|
52 |
+
if not comments:
|
53 |
+
print("Нет комментариев для обработки.")
|
54 |
+
return []
|
55 |
+
|
56 |
+
comments_text = [comment['message'] for comment in comments]
|
57 |
+
sentiments = analyze_sentiment(comments_text)
|
58 |
+
negative_comments = filter_comments(comments, sentiments)
|
59 |
+
|
60 |
+
hidden_comments = []
|
61 |
+
for comment in negative_comments:
|
62 |
+
if hide_comment(comment['id']):
|
63 |
+
hidden_comments.append({
|
64 |
+
'id': comment['id'],
|
65 |
+
'message': comment['message']
|
66 |
+
})
|
67 |
+
|
68 |
+
return hidden_comments
|
69 |
+
|
70 |
+
|
71 |
+
def get_facebook_comments(post_id, ACCESS_TOKEN):
|
72 |
+
print(f"Получаем комментарии для поста: {post_id}")
|
73 |
+
url = f"{GRAPH_API_URL}/{post_id}/comments"
|
74 |
+
params = {
|
75 |
+
'access_token': ACCESS_TOKEN,
|
76 |
+
'filter': 'stream'
|
77 |
+
}
|
78 |
+
response = requests.get(url, params=params)
|
79 |
+
if response.status_code == 200:
|
80 |
+
print("Комментарии успешно получены.")
|
81 |
+
return response.json().get('data', [])
|
82 |
+
else:
|
83 |
+
print(f"Ошибка при получении комментариев: {response.text}")
|
84 |
+
return []
|
85 |
+
|
86 |
+
|
87 |
+
def get_page_id(page_access_token):
|
88 |
+
url = f"{GRAPH_API_URL}/me"
|
89 |
+
params = {
|
90 |
+
"access_token": page_access_token,
|
91 |
+
"fields": "id,name"
|
92 |
+
}
|
93 |
+
response = requests.get(url, params=params)
|
94 |
+
data = response.json()
|
95 |
+
if 'error' in data:
|
96 |
+
print(f"Ошибка при получении ID страницы: {data['error']}")
|
97 |
+
return None
|
98 |
+
return data.get("id")
|
99 |
+
|
100 |
+
|
101 |
+
def get_posts(page_id, page_access_token):
|
102 |
+
url = f"{GRAPH_API_URL}/{page_id}/posts"
|
103 |
+
params = {
|
104 |
+
"access_token": page_access_token,
|
105 |
+
"fields": "id"
|
106 |
+
# Максимальное количество постов за запрос
|
107 |
+
}
|
108 |
+
posts = []
|
109 |
+
while True:
|
110 |
+
response = requests.get(url, params=params)
|
111 |
+
data = response.json()
|
112 |
+
if 'error' in data:
|
113 |
+
print(f"Ошибка при получении постов: {data['error']}")
|
114 |
+
break
|
115 |
+
posts.extend(data.get("data", []))
|
116 |
+
if 'paging' in data and 'next' in data['paging']:
|
117 |
+
url = data['paging']['next']
|
118 |
+
params = {} # Следующие запросы уже содержат все параметры в URL
|
119 |
+
else:
|
120 |
+
break
|
121 |
+
return posts
|
122 |
+
|
123 |
+
|
124 |
+
def get_comments(post_id, page_access_token):
|
125 |
+
url = f"{GRAPH_API_URL}/{post_id}/comments"
|
126 |
+
params = {
|
127 |
+
"access_token": page_access_token,
|
128 |
+
"fields": "id,from,message,is_hidden",
|
129 |
+
|
130 |
+
}
|
131 |
+
comments = []
|
132 |
+
while True:
|
133 |
+
response = requests.get(url, params=params)
|
134 |
+
data = response.json()
|
135 |
+
if 'error' in data:
|
136 |
+
print(f"Ошибка при получении комментариев к посту {post_id}: {data['error']}")
|
137 |
+
break
|
138 |
+
comments.extend(data.get("data", []))
|
139 |
+
if 'paging' in data and 'next' in data['paging']:
|
140 |
+
url = data['paging']['next']
|
141 |
+
params = {} # Следующие запросы уже содержат все параметры в URL
|
142 |
+
else:
|
143 |
+
break
|
144 |
+
return comments
|
145 |
+
|
146 |
+
|
147 |
+
def has_page_replied(comment_id, page_id, page_access_token):
|
148 |
+
url = f"{GRAPH_API_URL}/{comment_id}/comments"
|
149 |
+
params = {
|
150 |
+
"access_token": page_access_token,
|
151 |
+
"fields": "from{id}",
|
152 |
+
|
153 |
+
}
|
154 |
+
while True:
|
155 |
+
response = requests.get(url, params=params)
|
156 |
+
data = response.json()
|
157 |
+
if 'error' in data:
|
158 |
+
print(f"Ошибка при получении ответов на комментарий {comment_id}: {data['error']}")
|
159 |
+
return False
|
160 |
+
for reply in data.get("data", []):
|
161 |
+
if reply['from']['id'] == page_id:
|
162 |
+
return True
|
163 |
+
if 'paging' in data and 'next' in data['paging']:
|
164 |
+
url = data['paging']['next']
|
165 |
+
params = {}
|
166 |
+
else:
|
167 |
+
break
|
168 |
+
return False
|
169 |
+
|
170 |
+
|
171 |
+
def get_unanswered_comments(page_access_token):
|
172 |
+
page_id = get_page_id(page_access_token)
|
173 |
+
if not page_id:
|
174 |
+
return []
|
175 |
+
|
176 |
+
print(f"ID Страницы: {page_id}")
|
177 |
+
posts = get_posts(page_id, page_access_token)
|
178 |
+
unanswered_comments = []
|
179 |
+
|
180 |
+
for post in posts:
|
181 |
+
post_id = post['id']
|
182 |
+
print(f"Обработка поста: {post_id}")
|
183 |
+
comments = get_comments(post_id, page_access_token)
|
184 |
+
|
185 |
+
for comment in comments:
|
186 |
+
if comment.get('is_hidden', False):
|
187 |
+
continue
|
188 |
+
comment_id = comment['id']
|
189 |
+
print(f"Проверка комментария: {comment_id}")
|
190 |
+
if not has_page_replied(comment_id, page_id, page_access_token):
|
191 |
+
unanswered_comments.append(comment)
|
192 |
+
|
193 |
+
return unanswered_comments
|
194 |
+
|
195 |
+
|
196 |
+
def reply_comment(comment_id, message, token):
|
197 |
+
url = f"{GRAPH_API_URL}/{comment_id}/comments"
|
198 |
+
params = {
|
199 |
+
'access_token': token,
|
200 |
+
'message': message
|
201 |
+
}
|
202 |
+
response = requests.post(url, params=params)
|
203 |
+
if response.status_code == 200:
|
204 |
+
print(f"Ответ успешно отправлен на комментарий {comment_id}.")
|
205 |
+
return True
|
206 |
+
else:
|
207 |
+
print(f"Ошибка при отправке ответа: {response.text}")
|
208 |
+
return False
|