tekitoumemo’s diary

思ったことを書くだけ。長文版Twitter

CoreTweetの検索をインジェクションで

.NETのTwitterライブラリにCoreTweetってのがあります。TwitterAPIのラッパーです。

www.nuget.org

最近、コンテンツ追加にCoreTweetを使ったので簡単な検索方法を説明します。以下のような感じで「続きを読む」を押すと過去5件でツイートが表示されます。
f:id:tekitoumemo:20190103214243p:plain


.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>にしてTweetsAsyncと全く同じように使えるようにします。

呼び出し側

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("&amp;", "&")
本文にキーワードが含まれているものを抽出
Where(x => x.FullText.ToUpper().Contains(keyword.ToUpper())).

結構簡単に使えるので良いですね。次は.NET Coreでの認証を書きます。