-
Notifications
You must be signed in to change notification settings - Fork 1k
/
Copy pathlookup_blocks.cs
150 lines (129 loc) · 5.5 KB
/
lookup_blocks.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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using System.Security.Cryptography;
using System.Web;
using Newtonsoft.Json.Linq;
namespace TwitterAPIBlocksLookup
{
class Program
{
static async Task Main(string[] args)
{
const string endpointURL = "https://api.twitter.com/2/users/your-user-id/blocking";
const string requestTokenURL = "https://api.twitter.com/oauth/request_token?oauth_callback=oob";
const string accessTokenURL = "https://api.twitter.com/oauth/access_token";
const string consumer_key = Environment.GetEnvironmentVariable("CONSUMER_KEY");
const string consumer_secret = Environment.GetEnvironmentVariable("CONSUMER_SECRET");
string oauth_token, oauth_token_secret;
var oauth = new OAuth1(consumer_key, consumer_secret);
Console.Write("Enter the PIN (if you don't have it, please authorize the app via the link below): ");
// Get request token
var requestTokenResponse = await oauth.PostAsync(requestTokenURL, null);
var requestTokens = HttpUtility.ParseQueryString(requestTokenResponse);
oauth_token = requestTokens["oauth_token"];
oauth_token_secret = requestTokens["oauth_token_secret"];
// Get authorization
var authorizeURL = new Uri("https://api.twitter.com/oauth/authorize");
authorizeURL = authorizeURL.AddParameter("oauth_token", oauth_token);
Console.WriteLine($"Please authorize the app via the following URL: {authorizeURL}");
var pin = Console.ReadLine().Trim();
// Get the access token
var accessTokenParams = new Dictionary<string, string>
{
{"oauth_verifier", pin},
{"oauth_token", oauth_token}
};
oauth_token_secret = requestTokens["oauth_token_secret"];
var accessTokenResponse = await oauth.PostAsync(accessTokenURL, accessTokenParams, oauth_token_secret);
var accessTokens = HttpUtility.ParseQueryString(accessTokenResponse);
oauth_token = accessTokens["oauth_token"];
oauth_token_secret = accessTokens["oauth_token_secret"];
// Make the request
var getRequestParams = new Dictionary<string, string>
{
{"user.fields", "id,name,created_at,description,location,url,public_metrics"},
{"expansions", "pinned_tweet_id"}
};
var getRequestResponse = await oauth.GetAsync(endpointURL, getRequestParams, oauth_token_secret);
var json = JObject.Parse(getRequestResponse);
Console.WriteLine(json.ToString());
}
}
static class Extensions
{
public static Uri AddParameter(this Uri uri, string paramName, string paramValue)
{
var queryString = HttpUtility.ParseQueryString(uri.Query);
queryString[paramName] = paramValue;
var builder = new UriBuilder(uri);
builder.Query = queryString.ToString();
return builder.Uri;
}
}
class OAuth1
{
readonly string _consumerKey;
readonly string _consumerSecret;
public OAuth1(string consumerKey, string consumerSecret)
{
_consumerKey = consumerKey;
_consumerSecret = consumerSecret;
}
private string GenerateNonce()
{
var random = new Random();
var nonce = new StringBuilder();
for (int i = 0; i < 32; i++)
{
nonce.Append(random.Next(0, 10));
}
return nonce.ToString();
}
private string GenerateTimestamp()
{
return ((int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).ToString();
}
public async Task<string> PostAsync(string url, Dictionary<string, string> parameters, string accessToken, string accessTokenSecret)
{
var oauth = new OAuth()
{
ConsumerKey = consumerKey,
ConsumerSecret = consumerSecret,
AccessToken = accessToken,
AccessTokenSecret = accessTokenSecret,
SignatureMethod = OAuthSignatureMethod.HmacSha1,
Version = "1.0",
};
var timestamp = GenerateTimestamp();
var nonce = GenerateNonce();
parameters.Add("oauth_consumer_key", oauth.ConsumerKey);
parameters.Add("oauth_nonce", nonce);
parameters.Add("oauth_signature_method", oauth.SignatureMethod.ToString());
parameters.Add("oauth_timestamp", timestamp);
parameters.Add("oauth_token", oauth.AccessToken);
parameters.Add("oauth_version", oauth.Version);
var signature = oauth.GenerateSignature(HttpMethod.Post.ToString(), url, parameters);
parameters.Add("oauth_signature", signature);
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("OAuth", BuildOAuthHeaderString(parameters));
var response = await client.PostAsync(url, new FormUrlEncodedContent(parameters));
var responseString = await response.Content.ReadAsStringAsync();
return responseString;
}
private string BuildOAuthHeaderString(Dictionary<string, string> parameters) {
var headerParams = parameters
.Where(p => p.Key.StartsWith("oauth_"))
.OrderBy(p => p.Key)
.Select(p => $"{Uri.EscapeDataString(p.Key)}=\"{Uri.EscapeDataString(p.Value)}\"");
return string.Join(",", headerParams);
}
}
}
// Example usage:
// var twitterApi = new TwitterApi("YOUR-CONSUMER-KEY", "YOUR-CONSUMER-SECRET");
// var accessToken = await twitterApi.GetAccessTokenAsync("YOUR-REQUEST-TOKEN", "YOUR-REQUEST-TOKEN-SECRET", "PIN-CODE");
// var response = await twitterApi.PostAsync("https://api.twitter.com/1.1/statuses/update.json", new Dictionary<string, string> {{"status", "Hello Twitter!"}}, accessToken.Token, accessToken.TokenSecret);