/// <summary> /// appends parameters for <see cref="Tweet"/> request /// </summary> /// <param name="parameters">list of parameters from expression tree</param> /// <param name="url">base url</param> /// <returns>base url + parameters</returns> Request BuildUrlParameters(Dictionary <string, string> parameters, string url) { var req = new Request(BaseUrl + url); var urlParams = req.RequestParameters; if (parameters.ContainsKey(nameof(Ids))) { Ids = parameters[nameof(Ids)]; urlParams.Add(new QueryParameter("ids", Ids.Replace(" ", ""))); } else { throw new ArgumentException($"{nameof(Ids)} is required", nameof(Ids)); } if (parameters.ContainsKey(nameof(Expansions))) { Expansions = parameters[nameof(Expansions)]; urlParams.Add(new QueryParameter("expansions", Expansions.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(MediaFields))) { MediaFields = parameters[nameof(MediaFields)]; urlParams.Add(new QueryParameter("media.fields", MediaFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(PlaceFields))) { PlaceFields = parameters[nameof(PlaceFields)]; urlParams.Add(new QueryParameter("place.fields", PlaceFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(PollFields))) { PollFields = parameters[nameof(PollFields)]; urlParams.Add(new QueryParameter("poll.fields", PollFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(TweetFields))) { TweetFields = parameters[nameof(TweetFields)]; urlParams.Add(new QueryParameter("tweet.fields", TweetFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(UserFields))) { UserFields = parameters[nameof(UserFields)]; urlParams.Add(new QueryParameter("user.fields", UserFields.Replace(" ", ""))); } return(req); }
/// <summary> /// appends parameters for Tweet request /// </summary> /// <param name="parameters">list of parameters from expression tree</param> /// <param name="url">base url</param> /// <returns>base url + parameters</returns> void BuildUrlParameters(Dictionary <string, string> parameters, IList <QueryParameter> urlParams) { if (parameters.ContainsKey(nameof(Expansions))) { Expansions = parameters[nameof(Expansions)]; urlParams.Add(new QueryParameter("expansions", Expansions.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(MediaFields))) { MediaFields = parameters[nameof(MediaFields)]; urlParams.Add(new QueryParameter("media.fields", MediaFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(PlaceFields))) { PlaceFields = parameters[nameof(PlaceFields)]; urlParams.Add(new QueryParameter("place.fields", PlaceFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(PollFields))) { PollFields = parameters[nameof(PollFields)]; urlParams.Add(new QueryParameter("poll.fields", PollFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(TweetFields))) { TweetFields = parameters[nameof(TweetFields)]; urlParams.Add(new QueryParameter("tweet.fields", TweetFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(UserFields))) { UserFields = parameters[nameof(UserFields)]; urlParams.Add(new QueryParameter("user.fields", UserFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(Ids))) { Ids = parameters[nameof(Ids)]; urlParams.Add(new QueryParameter("ids", Ids.Replace(" ", ""))); } }
/// <summary> /// Specifies the fields to be returned in the current request. /// </summary> /// <param name="fields">The tweet fields.</param> /// <returns> /// The current request builder. /// </returns> IFieldsCalled IFieldsCalling <IFieldsCalled, TweetFields> .Fields(TweetFields fields) { this.StreamRequest.Configuration.Fields = fields; return(this); }
public static string ToQueryString(this TweetFields value) { if (value == TweetFields.None) { return(""); } var builder = new StringBuilder(); if ((value & TweetFields.Attachments) != 0) { builder.Append("attachments,"); } if ((value & TweetFields.AuthorId) != 0) { builder.Append("author_id,"); } if ((value & TweetFields.ContextAnnotations) != 0) { builder.Append("context_annotations,"); } if ((value & TweetFields.ConversationId) != 0) { builder.Append("conversation_id,"); } if ((value & TweetFields.CreatedAt) != 0) { builder.Append("created_at,"); } if ((value & TweetFields.Entities) != 0) { builder.Append("entities,"); } if ((value & TweetFields.Geo) != 0) { builder.Append("geo,"); } if ((value & TweetFields.Id) != 0) { builder.Append("id,"); } if ((value & TweetFields.InReplyToUserId) != 0) { builder.Append("in_reply_to_user_id,"); } if ((value & TweetFields.Lang) != 0) { builder.Append("lang,"); } if ((value & TweetFields.NonPublicMetrics) != 0) { builder.Append("non_public_metrics,"); } if ((value & TweetFields.PublicMetrics) != 0) { builder.Append("public_metrics,"); } if ((value & TweetFields.OrganicMetrics) != 0) { builder.Append("organic_metrics,"); } if ((value & TweetFields.PromotedMetrics) != 0) { builder.Append("promoted_metrics,"); } if ((value & TweetFields.PossiblySensitive) != 0) { builder.Append("possibly_sensitive,"); } if ((value & TweetFields.ReferencedTweets) != 0) { builder.Append("referenced_tweets,"); } if ((value & TweetFields.Source) != 0) { builder.Append("source,"); } if ((value & TweetFields.Text) != 0) { builder.Append("text,"); } if ((value & TweetFields.Withheld) != 0) { builder.Append("withheld,"); } return(builder.ToString(0, builder.Length - 1)); }
/// <summary> /// appends parameters for Search request /// </summary> /// <param name="parameters">list of parameters from expression tree</param> /// <param name="url">base url</param> /// <returns>base url + parameters</returns> private Request BuildSearchUrlParameters(Dictionary <string, string> parameters, string url) { var req = new Request(BaseUrl + url); var urlParams = req.RequestParameters; if (parameters.ContainsKey(nameof(Query)) && !string.IsNullOrWhiteSpace(parameters[nameof(Query)])) { Query = parameters[nameof(Query)]; urlParams.Add(new QueryParameter("query", Query)); } else { throw new ArgumentNullException(nameof(Query), "Query filter in where clause is required."); } if (parameters.ContainsKey(nameof(EndTime))) { EndTime = DateTime.Parse(parameters[nameof(EndTime)]); urlParams.Add(new QueryParameter("end_time", EndTime.ToString(L2TKeys.ISO8601, CultureInfo.InvariantCulture))); } if (parameters.ContainsKey(nameof(Expansions))) { Expansions = parameters[nameof(Expansions)]; urlParams.Add(new QueryParameter("expansions", Expansions.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(MaxResults))) { MaxResults = int.Parse(parameters[nameof(MaxResults)]); urlParams.Add(new QueryParameter("max_results", MaxResults.ToString(CultureInfo.InvariantCulture))); } if (parameters.ContainsKey(nameof(MediaFields))) { MediaFields = parameters[nameof(MediaFields)]; urlParams.Add(new QueryParameter("media.fields", MediaFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(NextToken))) { NextToken = parameters[nameof(NextToken)]; urlParams.Add(new QueryParameter("next_token", NextToken)); } if (parameters.ContainsKey(nameof(PlaceFields))) { PlaceFields = parameters[nameof(PlaceFields)]; urlParams.Add(new QueryParameter("place.fields", PlaceFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(PollFields))) { PollFields = parameters[nameof(PollFields)]; urlParams.Add(new QueryParameter("poll.fields", PollFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(SinceID))) { SinceID = parameters[nameof(SinceID)]; urlParams.Add(new QueryParameter("since_id", SinceID)); } if (parameters.ContainsKey(nameof(StartTime))) { StartTime = DateTime.Parse(parameters[nameof(StartTime)]); urlParams.Add(new QueryParameter("start_time", StartTime.ToString(L2TKeys.ISO8601, CultureInfo.InvariantCulture))); } if (parameters.ContainsKey(nameof(TweetFields))) { TweetFields = parameters[nameof(TweetFields)]; urlParams.Add(new QueryParameter("tweet.fields", TweetFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(UntilID))) { UntilID = parameters[nameof(UntilID)]; urlParams.Add(new QueryParameter("until_id", UntilID)); } if (parameters.ContainsKey(nameof(UserFields))) { UserFields = parameters[nameof(UserFields)]; urlParams.Add(new QueryParameter("user.fields", UserFields.Replace(" ", ""))); } return(req); }
/// <summary> /// Retrieves the tweets asynchronously. /// </summary> /// <param name="accessToken">The access token.</param> /// <param name="ids">The list of Twitter handles (without "@" character).</param> /// <param name="since">UTC time for the earliest tweet. Always matched again the <see cref="Tweet.GatheredTime" />. /// Must be earlier than <paramref name="until" />. /// The <paramref name="since" /> can be maximally 30 days in the past. /// Default value is 30 minutes in the past from the current UTC time.</param> /// <param name="until">UTC time for the latest tweet. Always matched again the <see cref="Tweet.GatheredTime" />. /// Must be later than <paramref name="since" />. /// Default value is the current time in UTC.</param> /// <param name="fields">The fields to be retrieved and filled in the <see cref="Tweet" />.</param> /// <returns> /// The tweets list sorted by <see cref="Tweet.GatheredTime" /> from newest to oldest. If no tweets are retrieved an empty list is returned. /// </returns> /// <example> /// <code> /// var tweets = await komfoProvider.RetrieveTweetsAsync("<your_access_token>", new[] { "dkoroedova", "bkoroedova" }); /// foreach (var tweet in tweets) /// { /// this.ShowTweet(tweet); /// } /// </code> /// </example> public virtual async Task <IEnumerable <Tweet> > RetrieveTweetsAsync(string accessToken, IEnumerable <string> ids, DateTime?since = null, DateTime?until = null, TweetFields fields = TweetFields.All) { Assert.ArgumentNotNull(accessToken, "accessToken"); Assert.ArgumentNotNull(ids, "ids"); Assert.ArgumentCondition(fields != TweetFields.None, "fields", "At least one field should be specified."); if (since.HasValue) { Assert.ArgumentCondition(since.Value.Kind == DateTimeKind.Utc, "since", "DateTime should be in the UTC format."); } if (until.HasValue) { Assert.ArgumentCondition(until.Value.Kind == DateTimeKind.Utc, "until", "DateTime should be in the UTC format."); } var idsList = ids as IList <string> ?? ids.ToList(); Assert.ArgumentCondition(idsList.Any(), "ids", "There should be at least one Twitter handle."); var queryString = HttpUtility.ParseQueryString(string.Empty); queryString["ids"] = string.Join(",", idsList); if (fields != TweetFields.All) { queryString["fields"] = this.ParseFlagsEnum(fields); } if (since.HasValue) { queryString["since"] = since.Value.ToUtcIso(); } if (until.HasValue) { queryString["until"] = until.Value.ToUtcIso(); } var responseContent = await this.SendJsonRequestAsync(HttpMethod.Get, this.endpointsConfiguration.Stream, accessToken, null, queryString); return(JsonConvert.DeserializeAnonymousType(responseContent, new { Data = new List <Tweet>() }).Data); }
/// <summary> /// builds url based on input parameters /// </summary> /// <param name="parameters">criteria for url segments and parameters</param> /// <returns>URL conforming to Twitter API</returns> public Request BuildUrl(Dictionary <string, string> parameters) { if (parameters.ContainsKey(nameof(Type))) { Type = RequestProcessorHelper.ParseEnum <SearchType>(parameters[nameof(Type)]); } else { throw new ArgumentException($"{nameof(Type)} is required", nameof(Type)); } string urlSegment = Type switch { SearchType.FullSearch => "tweets/search/all", SearchType.RecentSearch => "tweets/search/recent", _ => throw new ArgumentException($"Unknown SearchType: '{Type}'") }; return(BuildSearchUrlParameters(parameters, urlSegment)); } /// <summary> /// appends parameters for Search request /// </summary> /// <param name="parameters">list of parameters from expression tree</param> /// <param name="url">base url</param> /// <returns>base url + parameters</returns> Request BuildSearchUrlParameters(Dictionary <string, string> parameters, string url) { var req = new Request(BaseUrl + url); var urlParams = req.RequestParameters; if (parameters.ContainsKey(nameof(Query)) && !string.IsNullOrWhiteSpace(parameters[nameof(Query)])) { Query = parameters[nameof(Query)]; urlParams.Add(new QueryParameter("query", Query)); } else { throw new ArgumentNullException(nameof(Query), "Query filter in where clause is required."); } if (parameters.ContainsKey(nameof(EndTime))) { EndTime = DateTime.Parse(parameters[nameof(EndTime)]); urlParams.Add(new QueryParameter("end_time", EndTime.ToString(L2TKeys.ISO8601, CultureInfo.InvariantCulture))); } if (parameters.ContainsKey(nameof(Expansions))) { Expansions = parameters[nameof(Expansions)]; urlParams.Add(new QueryParameter("expansions", Expansions.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(MaxResults))) { MaxResults = int.Parse(parameters[nameof(MaxResults)]); urlParams.Add(new QueryParameter("max_results", MaxResults.ToString(CultureInfo.InvariantCulture))); } if (parameters.ContainsKey(nameof(MediaFields))) { MediaFields = parameters[nameof(MediaFields)]; urlParams.Add(new QueryParameter("media.fields", MediaFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(NextToken))) { NextToken = parameters[nameof(NextToken)]; urlParams.Add(new QueryParameter("next_token", NextToken)); } if (parameters.ContainsKey(nameof(PlaceFields))) { PlaceFields = parameters[nameof(PlaceFields)]; urlParams.Add(new QueryParameter("place.fields", PlaceFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(PollFields))) { PollFields = parameters[nameof(PollFields)]; urlParams.Add(new QueryParameter("poll.fields", PollFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(SinceID))) { SinceID = parameters[nameof(SinceID)]; urlParams.Add(new QueryParameter("since_id", SinceID)); } if (parameters.ContainsKey(nameof(StartTime))) { StartTime = DateTime.Parse(parameters[nameof(StartTime)]); urlParams.Add(new QueryParameter("start_time", StartTime.ToString(L2TKeys.ISO8601, CultureInfo.InvariantCulture))); } if (parameters.ContainsKey(nameof(TweetFields))) { TweetFields = parameters[nameof(TweetFields)]; urlParams.Add(new QueryParameter("tweet.fields", TweetFields.Replace(" ", ""))); } if (parameters.ContainsKey(nameof(UntilID))) { UntilID = parameters[nameof(UntilID)]; urlParams.Add(new QueryParameter("until_id", UntilID)); } if (parameters.ContainsKey(nameof(UserFields))) { UserFields = parameters[nameof(UserFields)]; urlParams.Add(new QueryParameter("user.fields", UserFields.Replace(" ", ""))); } return(req); }