Uniaff commited on
Commit
832a14c
·
verified ·
1 Parent(s): 4a36ad2

Update func_facebook.py

Browse files
Files changed (1) hide show
  1. func_facebook.py +155 -145
func_facebook.py CHANGED
@@ -1,126 +1,116 @@
 
 
1
  import facebook
2
  import requests
3
- from func_ai import analyze_sentiment
 
4
 
5
  GRAPH_API_URL = 'https://graph.facebook.com/v20.0'
6
 
7
- def hide_negative_comments(token):
8
- def init_facebook_client(token):
9
- print("Инициализация клиента Facebook.")
10
- return facebook.GraphAPI(access_token=token)
11
-
12
- def get_facebook_posts():
13
- print("Получение постов.")
14
- params = {
15
- 'include_inline_create': 'true'
16
- }
17
- graph = init_facebook_client(token)
18
-
19
- user_posts_data = graph.get_object(id='me/posts', fields='id,message,created_time')
20
- user_posts = user_posts_data.get('data', [])
21
- print(f"Найдено {len(user_posts)} пользовательских постов.")
22
-
23
- ads_posts_data = graph.get_object('me/ads_posts', **params)
24
- ads_posts = ads_posts_data.get('data', [])
25
- print(f"Найдено {len(ads_posts)} рекламных постов.")
26
-
27
- all_posts = user_posts + ads_posts
28
- print(f"Всего постов: {len(all_posts)}.")
29
-
30
- return all_posts
31
-
32
- def get_comments_for_post(post_id):
33
- print(f"Получение комментариев для поста {post_id}.")
34
- graph = init_facebook_client(token)
35
- comments = []
36
- url = f'{post_id}/comments'
37
- params = {'fields': 'id,message,is_hidden'}
38
- while True:
39
- comments_data = graph.get_object(id=url, **params)
40
- visible_comments = [comment for comment in comments_data.get('data', []) if not comment.get('is_hidden', False)]
41
- comments.extend(visible_comments)
42
- print(f"Найдено {len(visible_comments)} видимых комментариев для поста {post_id}.")
43
- if 'paging' in comments_data and 'next' in comments_data['paging']:
44
- url = comments_data['paging']['next']
45
- params = {}
46
- else:
47
- break
48
- return comments
49
-
50
- def filter_comments(comments, sentiments):
51
- print("Фильтрация негативных комментариев.")
52
- negative_comments = []
53
- for comment, sentiment in zip(comments, sentiments):
54
- if sentiment['label'].lower() == 'negative':
55
- print(f"Негативный комментарий найден: {comment['message']}")
56
- negative_comments.append(comment)
57
- return negative_comments
58
-
59
- def hide_comment(comment_id):
60
- print(f"Скрытие комментария {comment_id}.")
61
- graph = init_facebook_client(token)
62
- try:
63
- graph.request(f'{comment_id}', post_args={'is_hidden': True}, method='POST')
64
- return True
65
- except facebook.GraphAPIError as e:
66
- print(f"Ошибка при скрытии комментария {comment_id}: {e}")
67
- return False
68
-
69
- posts = get_facebook_posts()
70
- if not posts:
71
- print("Нет постов для обработки.")
72
- return []
73
-
74
- hidden_comments_per_post = []
75
- for post in posts:
76
- post_id = post['id']
77
- post_message = post.get('message', '')
78
- comments = get_comments_for_post(post_id)
79
- if not comments:
80
- print(f"Нет комментариев для поста {post_id}.")
81
- continue
82
-
83
- comments_text = [comment['message'] for comment in comments]
84
- sentiments = analyze_sentiment(comments_text)
85
- negative_comments = filter_comments(comments, sentiments)
86
-
87
- hidden_comments = []
88
- for comment in negative_comments:
89
- if hide_comment(comment['id']):
90
- hidden_comments.append({
91
- 'id': comment['id'],
92
- 'message': comment['message']
93
- })
94
-
95
- if hidden_comments:
96
- hidden_comments_per_post.append({
97
- 'post_id': post_id,
98
- 'post_message': post_message,
99
- 'hidden_comments': hidden_comments
100
- })
101
-
102
- return hidden_comments_per_post
103
 
 
 
 
104
 
105
  def get_page_id(page_access_token):
106
- print("Получение ID страницы.")
107
  url = f"{GRAPH_API_URL}/me"
108
  params = {
109
  "access_token": page_access_token,
110
- "fields": "id,name"
111
  }
112
  response = requests.get(url, params=params)
113
  data = response.json()
114
  if 'error' in data:
115
- print(f"Ошибка при получении ID стра��ицы: {data['error']}")
116
  return None
117
- return data.get("id")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
 
120
  def get_posts(page_id, page_access_token):
121
- print(f"Получение постов для страницы {page_id}.")
122
  url = f"{GRAPH_API_URL}/{page_id}/posts"
123
- url_ads = f"{GRAPH_API_URL}/{page_id}/ads_posts?include_inline_create=true"
124
  params = {
125
  "access_token": page_access_token,
126
  "fields": "id,message"
@@ -133,21 +123,22 @@ def get_posts(page_id, page_access_token):
133
  data = response.json()
134
 
135
  if 'error' in data:
136
- print(f"Ошибка при получении постов: {data['error']}")
137
  break
138
 
139
  posts.extend(data.get("data", []))
140
- print(f"Получено {len(data.get('data', []))} постов.")
141
-
 
142
  response_ads = requests.get(url_ads, params={"access_token": page_access_token, "fields": "id,message"})
143
  data_ads = response_ads.json()
144
 
145
  if 'error' in data_ads:
146
- print(f"Ошибка при получении рекламных постов: {data_ads['error']}")
147
  break
148
 
149
  posts.extend(data_ads.get("data", []))
150
- print(f"Получено {len(data_ads.get('data', []))} рекламных постов.")
151
 
152
  if 'paging' in data and 'next' in data['paging']:
153
  url = data['paging']['next']
@@ -157,9 +148,8 @@ def get_posts(page_id, page_access_token):
157
 
158
  return posts
159
 
160
-
161
  def get_comments(post_id, page_access_token):
162
- print(f"Получение комментариев для поста {post_id}.")
163
  url = f"{GRAPH_API_URL}/{post_id}/comments"
164
  params = {
165
  "access_token": page_access_token,
@@ -170,10 +160,10 @@ def get_comments(post_id, page_access_token):
170
  response = requests.get(url, params=params)
171
  data = response.json()
172
  if 'error' in data:
173
- print(f"Ошибка при получении комментариев к посту {post_id}: {data['error']}")
174
  break
175
  comments.extend(data.get("data", []))
176
- print(f"Найдено {len(data.get('data', []))} комментариев.")
177
  if 'paging' in data and 'next' in data['paging']:
178
  url = data['paging']['next']
179
  params = {}
@@ -181,45 +171,19 @@ def get_comments(post_id, page_access_token):
181
  break
182
  return comments
183
 
184
-
185
- def has_page_replied(comment_id, page_id, page_access_token):
186
- print(f"Проверка ответа на комментарий {comment_id}.")
187
- url = f"{GRAPH_API_URL}/{comment_id}/comments"
188
- params = {
189
- "access_token": page_access_token,
190
- "fields": "from{id}",
191
- }
192
- while True:
193
- response = requests.get(url, params=params)
194
- data = response.json()
195
- if 'error' in data:
196
- print(f"Ошибка при получении ответов на комментарий {comment_id}: {data['error']}")
197
- return False
198
- for reply in data.get("data", []):
199
- if reply['from']['id'] == page_id:
200
- print(f"Страница {page_id} уже ответила на комментарий {comment_id}.")
201
- return True
202
- if 'paging' in data and 'next' in data['paging']:
203
- url = data['paging']['next']
204
- params = {}
205
- else:
206
- break
207
- return False
208
-
209
-
210
  def get_unanswered_comments(page_access_token):
211
  page_id = get_page_id(page_access_token)
212
  if not page_id:
213
  return []
214
 
215
- print(f"ID Страницы: {page_id}")
216
  posts = get_posts(page_id, page_access_token)
217
  posts_with_unanswered_comments = []
218
 
219
  for post in posts:
220
  post_id = post['id']
221
  post_message = post.get('message', '')
222
- print(f"Обработка поста: {post_id}")
223
  comments = get_comments(post_id, page_access_token)
224
 
225
  unanswered_comments = []
@@ -228,7 +192,7 @@ def get_unanswered_comments(page_access_token):
228
  if comment.get('is_hidden', False):
229
  continue
230
  comment_id = comment['id']
231
- print(f"Проверка комментария: {comment_id}")
232
  if not has_page_replied(comment_id, page_id, page_access_token):
233
  unanswered_comments.append(comment)
234
 
@@ -241,9 +205,8 @@ def get_unanswered_comments(page_access_token):
241
 
242
  return posts_with_unanswered_comments
243
 
244
-
245
  def reply_comment(comment_id, message, token):
246
- print(f"Отправка ответа на комментарий {comment_id}.")
247
  url = f"{GRAPH_API_URL}/{comment_id}/comments"
248
  params = {
249
  'access_token': token,
@@ -251,8 +214,55 @@ def reply_comment(comment_id, message, token):
251
  }
252
  response = requests.post(url, params=params)
253
  if response.status_code == 200:
254
- print(f"Ответ успешно отправлен на комментарий {comment_id}.")
255
  return True
256
  else:
257
- print(f"Ошибка при отправке ответа: {response.text}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
258
  return False
 
1
+ # func_facebook.py
2
+
3
  import facebook
4
  import requests
5
+ from func_ai import analyze_sentiment, classify_comment, retrieve_from_vdb
6
+ from datetime import datetime
7
 
8
  GRAPH_API_URL = 'https://graph.facebook.com/v20.0'
9
 
10
+ def log_message(message):
11
+ timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
12
+ print(f"[{timestamp}] {message}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
+ def init_facebook_client(token):
15
+ log_message("Инициализация клиента Facebook.")
16
+ return facebook.GraphAPI(access_token=token)
17
 
18
  def get_page_id(page_access_token):
19
+ log_message("Получение ID страницы.")
20
  url = f"{GRAPH_API_URL}/me"
21
  params = {
22
  "access_token": page_access_token,
23
+ "fields": "id,name,accounts"
24
  }
25
  response = requests.get(url, params=params)
26
  data = response.json()
27
  if 'error' in data:
28
+ log_message(f"Ошибка при получении ID страницы: {data['error']}")
29
  return None
30
+ accounts = data.get("accounts", {}).get("data", [])
31
+ if not accounts:
32
+ log_message("Нет доступных страниц для управления.")
33
+ return None
34
+ # Предполагаем, что первая страница является целевой; при необходимости измените логику
35
+ return accounts[0].get("id")
36
+
37
+ def get_facebook_posts(token):
38
+ log_message("Получение постов.")
39
+ params = {
40
+ 'include_inline_create': 'true'
41
+ }
42
+ graph = init_facebook_client(token)
43
+
44
+ user_posts_data = graph.get_object(id='me/posts', fields='id,message,created_time')
45
+ user_posts = user_posts_data.get('data', [])
46
+ log_message(f"Найдено {len(user_posts)} пользовательских постов.")
47
 
48
+ try:
49
+ ads_posts_data = graph.get_object('me/ads_posts', **params)
50
+ ads_posts = ads_posts_data.get('data', [])
51
+ log_message(f"Найдено {len(ads_posts)} рекламных постов.")
52
+ except facebook.GraphAPIError as e:
53
+ log_message(f"Ошибка при получении рекламных постов: {e}")
54
+ ads_posts = []
55
+
56
+ all_posts = user_posts + ads_posts
57
+ log_message(f"Всего постов: {len(all_posts)}.")
58
+
59
+ return all_posts
60
+
61
+ def get_comments_for_post(post_id, token):
62
+ log_message(f"Получение комментариев для поста {post_id}.")
63
+ graph = init_facebook_client(token)
64
+ comments = []
65
+ url = f'{post_id}/comments'
66
+ params = {'fields': 'id,message,is_hidden'}
67
+ while True:
68
+ try:
69
+ comments_data = graph.get_object(id=url, **params)
70
+ except facebook.GraphAPIError as e:
71
+ log_message(f"Ошибка при получении комментариев: {e}")
72
+ break
73
+ visible_comments = [comment for comment in comments_data.get('data', []) if not comment.get('is_hidden', False)]
74
+ comments.extend(visible_comments)
75
+ log_message(f"Найдено {len(visible_comments)} видимых комментариев для поста {post_id}.")
76
+ if 'paging' in comments_data and 'next' in comments_data['paging']:
77
+ url = comments_data['paging']['next']
78
+ params = {}
79
+ else:
80
+ break
81
+ return comments
82
+
83
+ def has_page_replied(comment_id, page_id, page_access_token):
84
+ log_message(f"Проверка ответа на комментарий {comment_id}.")
85
+ url = f"{GRAPH_API_URL}/{comment_id}/comments"
86
+ params = {
87
+ "access_token": page_access_token,
88
+ "fields": "from{id,name}",
89
+ }
90
+ while True:
91
+ response = requests.get(url, params=params)
92
+ data = response.json()
93
+ if 'error' in data:
94
+ log_message(f"Ошибка при получении ответов на комментарий {comment_id}: {data['error']}")
95
+ return False
96
+ for reply in data.get("data", []):
97
+ from_id = reply.get('from', {}).get('id')
98
+ from_name = reply.get('from', {}).get('name')
99
+ log_message(f"Найден ответ от пользователя ID: {from_id}, Name: {from_name}")
100
+ if from_id == page_id:
101
+ log_message(f"Страница {page_id} уже ответила на комментарий {comment_id}.")
102
+ return True
103
+ if 'paging' in data and 'next' in data['paging']:
104
+ url = data['paging']['next']
105
+ params = {}
106
+ else:
107
+ break
108
+ return False
109
 
110
  def get_posts(page_id, page_access_token):
111
+ log_message(f"Получение постов для страницы {page_id}.")
112
  url = f"{GRAPH_API_URL}/{page_id}/posts"
113
+ url_ads = f"{GRAPH_API_URL}/{page_id}/ads_posts"
114
  params = {
115
  "access_token": page_access_token,
116
  "fields": "id,message"
 
123
  data = response.json()
124
 
125
  if 'error' in data:
126
+ log_message(f"Ошибка при получении постов: {data['error']}")
127
  break
128
 
129
  posts.extend(data.get("data", []))
130
+ log_message(f"Получено {len(data.get('data', []))} постов.")
131
+
132
+ # Получение рекламных постов
133
  response_ads = requests.get(url_ads, params={"access_token": page_access_token, "fields": "id,message"})
134
  data_ads = response_ads.json()
135
 
136
  if 'error' in data_ads:
137
+ log_message(f"Ошибка при получении рекламных постов: {data_ads['error']}")
138
  break
139
 
140
  posts.extend(data_ads.get("data", []))
141
+ log_message(f"Получено {len(data_ads.get('data', []))} рекламных постов.")
142
 
143
  if 'paging' in data and 'next' in data['paging']:
144
  url = data['paging']['next']
 
148
 
149
  return posts
150
 
 
151
  def get_comments(post_id, page_access_token):
152
+ log_message(f"Получение комментариев для поста {post_id}.")
153
  url = f"{GRAPH_API_URL}/{post_id}/comments"
154
  params = {
155
  "access_token": page_access_token,
 
160
  response = requests.get(url, params=params)
161
  data = response.json()
162
  if 'error' in data:
163
+ log_message(f"Ошибка при получении комментариев к посту {post_id}: {data['error']}")
164
  break
165
  comments.extend(data.get("data", []))
166
+ log_message(f"Найдено {len(data.get('data', []))} комментариев.")
167
  if 'paging' in data and 'next' in data['paging']:
168
  url = data['paging']['next']
169
  params = {}
 
171
  break
172
  return comments
173
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
174
  def get_unanswered_comments(page_access_token):
175
  page_id = get_page_id(page_access_token)
176
  if not page_id:
177
  return []
178
 
179
+ log_message(f"ID Страницы: {page_id}")
180
  posts = get_posts(page_id, page_access_token)
181
  posts_with_unanswered_comments = []
182
 
183
  for post in posts:
184
  post_id = post['id']
185
  post_message = post.get('message', '')
186
+ log_message(f"Обработка поста: {post_id}")
187
  comments = get_comments(post_id, page_access_token)
188
 
189
  unanswered_comments = []
 
192
  if comment.get('is_hidden', False):
193
  continue
194
  comment_id = comment['id']
195
+ log_message(f"Проверка комментария: {comment_id}")
196
  if not has_page_replied(comment_id, page_id, page_access_token):
197
  unanswered_comments.append(comment)
198
 
 
205
 
206
  return posts_with_unanswered_comments
207
 
 
208
  def reply_comment(comment_id, message, token):
209
+ log_message(f"Отправка ответа на комментарий {comment_id}.")
210
  url = f"{GRAPH_API_URL}/{comment_id}/comments"
211
  params = {
212
  'access_token': token,
 
214
  }
215
  response = requests.post(url, params=params)
216
  if response.status_code == 200:
217
+ log_message(f"Ответ успешно отправлен на комментарий {comment_id}.")
218
  return True
219
  else:
220
+ log_message(f"Ошибка при отправке ответа: {response.text}")
221
+ return False
222
+
223
+ def hide_negative_comments(token):
224
+ log_message("Начинаем процесс скрытия отрицательных комментариев.")
225
+ posts = get_facebook_posts(token)
226
+ if not posts:
227
+ log_message("Нет постов для обработки.")
228
+ return []
229
+
230
+ hidden_comments_per_post = []
231
+ for post in posts:
232
+ post_id = post['id']
233
+ post_message = post.get('message', '')
234
+ comments = get_comments_for_post(post_id, token)
235
+ if not comments:
236
+ log_message(f"Нет комментариев для поста {post_id}.")
237
+ continue
238
+
239
+ comments_text = [comment['message'] for comment in comments]
240
+ sentiments = analyze_sentiment(comments_text)
241
+ negative_comments = [comment for comment, sentiment in zip(comments, sentiments) if sentiment['label'].lower() == 'negative']
242
+
243
+ hidden_comments = []
244
+ for comment in negative_comments:
245
+ if hide_comment(comment['id'], token):
246
+ hidden_comments.append({
247
+ 'id': comment['id'],
248
+ 'message': comment['message']
249
+ })
250
+
251
+ if hidden_comments:
252
+ hidden_comments_per_post.append({
253
+ 'post_id': post_id,
254
+ 'post_message': post_message,
255
+ 'hidden_comments': hidden_comments
256
+ })
257
+
258
+ return hidden_comments_per_post
259
+
260
+ def hide_comment(comment_id, token):
261
+ log_message(f"Скрытие комментария {comment_id}.")
262
+ graph = init_facebook_client(token)
263
+ try:
264
+ graph.request(f'{comment_id}', post_args={'is_hidden': True}, method='POST')
265
+ return True
266
+ except facebook.GraphAPIError as e:
267
+ log_message(f"Ошибка при скрытии комментария {comment_id}: {e}")
268
  return False