CoreTweetの検索をインジェクションで
.NETのTwitterライブラリにCoreTweetってのがあります。TwitterAPIのラッパーです。
最近、コンテンツ追加にCoreTweetを使ったので簡単な検索方法を説明します。以下のような感じで「続きを読む」を押すと過去5件でツイートが表示されます。
.NET Coreで実装したのでSeviceに登録してインジェクションするやり方です。
ダウンロード
dotnet add package CoreTweet --version 1.0.0.483
大枠を作成
// class public class Twitter : ITwitter { private Tokens _tokens; public Twitter (string consumerKey, string consumerSecret, string accessToken, string accessSecret) { _tokens = Tokens.Create (consumerKey, consumerSecret, accessToken, accessSecret); } } // interface public interface ITwitter { }
consumerKey、consumerSecret、accessToken、accessSecretはhttps://apps.twitter.com/から取得してください。interfaceは後から追加するので今は枠組みだけです。
Startup.csに登録
services.AddSingleton<ITwitter> (_ => new Twitter (consumerKey, consumerSecret, accessToken, accessSecret)); }
これでインジェクションできる準備ができました。今回はシングルトンで問題ないのでシングルトンにしました。
検索メソッドを追加
public class Twitter : ITwitter { private Tokens _tokens; public Twitter (string consumerKey, string consumerSecret, string accessToken, string accessSecret) { _tokens = Tokens.Create (consumerKey, consumerSecret, accessToken, accessSecret); } // これ追加 public async Task<SearchResult> SearchTweets (params Expression<Func<string, object>>[] parameters) { return await _tokens.Search.TweetsAsync (parameters); } } // interface public interface ITwitter { Task<SearchResult> SearchTweets (params Expression<Func<string, object>>[] parameters); }
Twitterは結構いろんなところで使いそうなのでinterfaceだけ定義してインジェクションして使えるようにしました。引数はExpression
呼び出し側
public class TwitterRepository : ITwitterRepository { private ITwitter _twitter; public TwitterRepository (Twitter twitter) { _twitter = twitter; } public async Task SearchTweets (string keyword, long? maxId = null) { var tweets = await _twitter.SearchTweets (count => 100, q => keyword, max_id => maxId, lang => "ja", exclude => "retweets", tweet_mode => "extended"); } }
コンストラクタでインジェクションしてSearchTweetsで使ってます。オプションがいくつかあるので以下で説明します。以下のURLに全部乗ってます。
API reference index — Twitter Developers
max_id:twitterIdを指定するとtwitterIdより過去の記事を取得します。
lang:言語を指定します。jaは日本語です。
exclude:リツイートを除外します。僕は不要なんで必要なかったです。
tweet_mode:デフォルトだと140文字を取得できないので"extended"を指定して全部取れるようにします。
そのほか
これらはオプションであるかもしれません。
でかい画像に変換
ser.ProfileImageUrlで画像を取れるのですが、「normal.jpg」だと画像が小さいので「bigger.jpg」に置換しています。
User.ProfileImageUrl.Replace("normal.jpg", "bigger.jpg")
メタを置換
&は微妙なので
FullText.Replace("&", "&")
本文にキーワードが含まれているものを抽出
Where(x => x.FullText.ToUpper().Contains(keyword.ToUpper())).
結構簡単に使えるので良いですね。次は.NET Coreでの認証を書きます。