forked from dvygolov/FB.QuickCommenter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFanPageManager.cs
110 lines (102 loc) · 4.84 KB
/
FanPageManager.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
using FB.QuickCommenter.Helpers;
using FB.QuickCommenter.Model;
using Newtonsoft.Json.Linq;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace FB.QuickCommenter
{
public class FanPageManager
{
private readonly RequestExecutor _re;
public FanPageManager(RequestExecutor re)
{
_re = re;
}
public async Task<List<JToken>> ListFanPagesAsync()
{
var request = new RestRequest($"me/accounts", Method.GET);
request.AddQueryParameter("fields", "name,is_published,access_token");
request.AddQueryParameter("type", "page");
var json = await _re.ExecuteFbRequestAsync(request);
var pages = json["data"].OrderBy(p => p["name"].ToString()).ToList();
for (int i = 0; i < pages.Count; i++)
{
var p = pages[i];
Console.WriteLine($"{i + 1}. {p["name"]} ({p["id"]}) - {p["is_published"]}");
}
return pages;
}
public async Task<FanPage> SelectFanPageAsync()
{
var pages = await ListFanPagesAsync();
if (pages.Count == 0) return null;
PageStart:
int index;
bool goodRes;
do
{
Console.Write("Выберите страницу, введя её номер, и нажмите Enter:");
var readIndex = Console.ReadLine();
goodRes = int.TryParse(readIndex, out index);
index--;
if (index < 0 || index > pages.Count - 1) goodRes = false;
}
while (!goodRes);
var selectedPage = pages[index];
if (!bool.Parse(selectedPage["is_published"].ToString()))
{
Console.Write($"Страница {selectedPage["name"]} не опубликована! Опубликовать?");
if (YesNoSelector.ReadAnswerEqualsYes())
{
//Страница не опубликована! Пытаемся опубликовать
var request = new RestRequest(selectedPage["id"].ToString(), Method.POST);
request.AddParameter("access_token", selectedPage["access_token"].ToString());
request.AddParameter("is_published", "true");
var publishJson = await _re.ExecuteFbRequestAsync(request, false);
if (publishJson["error"] != null)
{
//невозможно опубликовать страницу, вероятно, она забанена!
Console.WriteLine($"Страница {selectedPage["name"]} не опубликована и, вероятно, забанена!");
goto PageStart;
}
else
{
//уведомим пользователя, что мы опубликовали страницу после снятия с публикации
Console.WriteLine($"Страница {selectedPage["name"]} была заново опубликована после снятия с публикации!");
return new FanPage(
selectedPage["id"].ToString(),
selectedPage["name"].ToString(),
selectedPage["access_token"].ToString());
}
}
else
goto PageStart;
}
return new FanPage(
selectedPage["id"].ToString(),
selectedPage["name"].ToString(),
selectedPage["access_token"].ToString());
}
public async Task<List<(string, string)>> GetPostIdsAsync(string fpId, string accessToken)
{
var req = new RestRequest($"{fpId}/published_posts", Method.GET);
Console.Write("Показать посты не рекламные (1/Enter) или рекламные (2)?:");
var user_input = Console.ReadLine();
if(user_input.Equals("2")){
Console.WriteLine("Выбраны посты рекламные.");
req = new RestRequest($"{fpId}/ads_posts", Method.GET);
}else{
Console.WriteLine("Выбраны посты не рекламные.");
}
req.AddQueryParameter("fields", "message");
req.AddQueryParameter("access_token", accessToken);
var json = await _re.ExecuteFbRequestAsync(req, changeToken: false);
return json["data"]
.Select(p => (p["id"].ToString(), p["message"]?.ToString()??"Без текста!"))
.ToList();
}
}
}