harukeeeのブログ

@harukeee が書いています。

Twitter Search API で 期間指定 の キーワード 検索してツイートを取得

radiko.jp を聴いてて思いつきで作った。

自分の備忘録も兼ねてメモ。

(メイン処理をほぼパクったはずだが元記事が不明...)

 

やってる事

・CoreTweet で Twitter API を呼んで、返ってきた値を JSON で出力。

・CoreTweet の Status クラスだと値が多いので TweetJson クラスで減らした。

 

環境=C#、CoreTweet、System.Runtime.Serialization.JsonTwitter API

 

Twitter Search API の制限

・1回のコールで取れるのは100件まで。

・コール回数は 15分毎 に 180回 まで。

・無料版(Standard)で取れるのは過去1週間分まで。

 

[画面]

f:id:harukeee:20180211042151p:plain

画面の値は Twitter Search API に投げる値そのもの。

 

[コード]

●TweetJsonクラス定義

public class TweetJson
{
public string CreatedAt { get; set; }
public int? FavoriteCount { get; set; }
public long TweetId { get; set; }
public bool? IsFavorited { get; set; }
public bool? IsRetweeted { get; set; }
public int? RetweetCount { get; set; }
public string Source { get; set; }
public string Text { get; set; }
public string ProfileImageUrl { get; set; }
public string ScreenName { get; set; }
public string Name { get; set; }
public long? UserId { get; set; }
}

 

●メイン処理

try
{
var tokens = Tokens.Create(
_ConsumerKey_, // string
_ConsumerSecret_, // string
_AccessToken_, // string
_AccessTokenSecret_ // string
);

var _since = this.textBox_since.Text; //画面
var _until = this.textBox_until.Text; //画面
var _keyword = this.textBox_keyword.Text; //画面

// ファイル名は実行日

var filename = String.Format("{0}.json", DateTime.Today.ToString("yyyyMMdd"));
File.Delete(filename); // あれば消す

long? maxid = null; //100件/回対策

for (;;)
{
var result = await tokens.Search.TweetsAsync(
count => 100,
q => _keyword,
since => _since,
until => _until,
max_id => maxid
);

foreach (var tweet in result)
{
// クラスの置き換え
TweetJson tw = new TweetJson();
tw.UserId = tweet.User.Id;
tw.Name = tweet.User.Name;
tw.ProfileImageUrl = tweet.User.ProfileImageUrl;
tw.ScreenName = tweet.User.ScreenName;

tw.TweetId = tweet.Id;
tw.CreatedAt = tweet.CreatedAt.LocalDateTime.ToString("yyyy/MM/dd HH:mm:ss");//UTCに注意
tw.FavoriteCount = tweet.FavoriteCount;
tw.IsFavorited = tweet.IsFavorited;
tw.IsRetweeted = tweet.IsRetweeted;
tw.RetweetCount = tweet.RetweetCount;
tw.Source = tweet.Source;
tw.Text = tweet.Text;

 

// クラス to JSON
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(TweetJson));
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, tw);

// JSONの書き出し
File.AppendAllText(
filename,
String.Format("{0}\r\n", Encoding.UTF8.GetString(ms.ToArray())),
Encoding.UTF8
);
}

if (result.SearchMetadata.NextResults != null)
{
maxid = result.Min(s => s.Id) - 1;
System.Threading.Thread.Sleep(6000); //180回/15分+気持ち1秒
continue;
}
break;
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}