10月以降も Twitter シェア数を取得する
2015年10月から、ツイートボタンが刷新されシェア数のカウント表示がなくなります。それにともないシェア数を取得できる非公式 API も廃止されます。
Twitter、ツイートボタン刷新でシェア数のカウント表示を10月から廃止 -INTERNET Watch
Web メディアなどでよくあるシェア数を自動ツイートするプログラムは、改修しなければ動作しないと思われます。このプログラミング生放送でも、プロ生ちゃんがシェア数を自動ツイートしています。
【50ツイート】これから「Twitter スタンプ」が流行る兆し!? http://t.co/cTHlbf1fj7 #自動
— プロ生ちゃん(暮井 慧)🍍 (@pronama) September 28, 2015
シェア数取得 API
そこで、10月以降もシェア数を取得できる API を作りました!
http://urlsapi.azurewebsites.net/count.json?url=http://example.jp にアクセスすると、これまでの count.json API と同じような結果が得られます。
{"count":79,"url":"https://pronama.jp/2015/09/28/twitter-stamp/"}
ただし、pronama.jp ドメイン以外は、1~6 の count 値を返します。プログラミング生放送のシェア数の取得またはサイコロなどにご活用ください。
検索 API からシェア数を求める
URL のシェア数(ツイート数)は、URL を検索することで近い値を求められます。ただし、すぐに古いツイートは検索で取得できなくなるため、こまめに結果を保存しておく必要があります。50や100 区切りでシェア数を定期的にツイートするようなプログラムは、もともといくつまでツイートしたか保存しておく必要があるので、少しの手間で改修できると思います。
C# と CoreTweet で書くとこのような感じでしょうか? ※ 実際にこのサイトで動かしているコードとは全然違います。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class SharedCountReulst | |
{ | |
public string Url { get; set; } | |
public long MaxId { get; set; } | |
public int Count { get; set; } | |
} | |
public static SharedCountReulst Count(string url, long sinceId) | |
{ | |
var tokens = CoreTweet.Tokens.Create(consumerKey, consumerSecret, accessToken, accessTokenSecret); | |
var result = new SharedCountReulst() { Url = url }; | |
var d = new Dictionary<string, object> { | |
{"result_type","recent" }, | |
{"count",100 }, | |
{"include_entities", false }, | |
{"q", url }, | |
{"since_id", sinceId }}; | |
var isFirstTime = true; | |
for (;;) | |
{ | |
// GET search/tweets | |
var searchResult = tokens.Search.Tweets(d); | |
// ループ内1回目の検索の場合、max_id を記録 | |
// (次回新たに最新のツイートから検索するときの since_id となる) | |
if (isFirstTime) | |
{ | |
result.MaxId = searchResult.SearchMetadata.MaxId; | |
isFirstTime = false; | |
} | |
// シェア数 | |
result.Count += searchResult.Count; | |
// 一度に全件取得できなかった場合、max_id = (取得したツイートの最小の ID) – 1 と設定し | |
// 古いツイートを検索・取得する | |
if (searchResult.SearchMetadata.NextResults != null) | |
{ | |
d["max_id"] = searchResult.Min(s => s.Id) – 1; | |
continue; | |
} | |
break; | |
} | |
return result; | |
} |
search/tweets API を利用します。q パラメーターに URL を指定します。
- 検索したとき、一番新しいツイートの ID をシェア数と併せて保存します。次回検索するとき since_id に指定し、取得済みのツイートより古いツイートは検索対象からはずします。
- 検索したとき、100件以上あり一度に取得できない場合は、一番古いツイートの ID – 1 の値を、max_id に指定し、繰り返し取得します。
API の呼び出し制限ですが、App auth であれば、450回/15min も検索できるので、たいていのサイトでは十分だと思います。