Uniaff commited on
Commit
554de16
·
verified ·
1 Parent(s): 9fc004d

Update func_facebook.py

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