モチベーション
- 2021年の夏ごろからContributionの計算式が変わった
- 「編集リクエストが承諾される」と、Contribution が 5 増えるようになった
- =太っ腹になった(従来でいうと、LGTM50の記事に送ったリクエストが採用されることに等しい)
-
編集リクエストを出しまくれば Contribution を爆上げできるのではないか?
- ゲームみたいでおもしろそう
以上、モチベーション
(追記)2022年4月1日から計算式が変わりました!!
5から1へ格下げになりました😭
GitHubのディスカッションにいろいろ意見があります
今後も計算式が変わることが予想されますので、最新の情報をあたってください
編集リクエストが採用されるには
記事から誤字脱字を見つけて、修正リクエストを出すことが近道だと思う
もう1つ重要なのが、その記事の著者が Qiita を継続して使用していること
せっかくリクエストを出しても、Qiita から zenn にお引っ越しされてたら、リクエストは永遠に承諾されないので。
Typo
私はTypoの修正も立派な貢献だと思っています。
誤字の修正も立派な貢献だと自分に言い聞かせる
【本題】記事から誤字を探す
- C# .NET 6.0 コンソールアプリケーション
- Qiita API v2
Qiita を継続して使用しているユーザーとは
Qiita トップページのトレンドに記事が載っているユーザーは、Qiita を継続して使用していると仮定する
つまり、トレンドに載っている記事を書いたユーザーはリクエストを承諾してくれる可能性が高い
せっかくなのでユーザーが過去に書いた記事もあわせて誤字探索する
トレンド記事を書いたユーザー一覧を取得する
XMLフィードを解析してユーザー(author)一覧を取得する
// トレンド記事の一覧を取得する
using var client = new HttpClient();
XNamespace xNamespace = @"http://www.w3.org/2005/Atom";
var feed = XDocument.Load(@"https://qiita.com/popular-items/feed");
var entries = feed.Element(xNamespace + "feed").Elements(xNamespace + "entry");
// 各記事の著者名を string 型で取得する(APIクエリで使用)
List<string> authorList = new ();
foreach (var entry in entries)
{
string author = entry.Element(xNamespace + "author").Value;
authorList.Add(author);
}
ユーザー一覧を取得した結果
左)Qiita トレンドのスクリーンショット
右)上記プログラムで取得したユーザーのリスト
ユーザーが書いた記事の一覧を取得する
Qiita APIをつかって記事を取得する
"投稿"セクションをみると、指定されたユーザーの記事一覧を、作成日時の降順で返してくれる
レスポンスの JSON に含まれるすべてのキーを使う必要はないので、要るものだけ選別してデータクラスをつくる
public class Response
{
public string url { get; set; }
public string title { get; set; }
public string body { get; set; }
}
このクラスのプロパティ名が JSON のキーに対応するので、先頭は大文字にしない
APIの仕様(↓)通りに GET リクエストを送信して、レスポンスである記事一覧items
を取得する
GET /api/v2/users/:user_id/items
)
var response = await client.GetStreamAsync(@"https://qiita.com/api/v2/users/" + author + "/items");
var items = JsonSerializer.Deserialize<Response[]>(response);
記事から誤字を探す
「トレンドに載っているユーザー数 × 各ユーザーが過去に書いた記事」の記事に対して、誤字をみつける
なにをもって誤字とするかは難しいところなので、誤字の辞書はあとで改善する
今回はお試しで、「てて」「にに」「をを」「はは」が誤字であると仮定する
foreach (var item in items)
{
var judge1 = item.body.Contains("てて");
var judge2 = item.body.Contains("にに");
var judge3 = item.body.Contains("をを");
var judge4 = item.body.Contains("はは");
if (judge1 || judge2 || judge3 || judge4)
{
Console.WriteLine("誤字がありました!");
}
}
API利用制限
認証している状態ではユーザーごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までリクエストを受け付けます。
トレンドに表示されるユーザーは 30 なので、認証がなくともすべてのユーザーの記事を取得できる
結果
- 「をを」は高確率で誤字
- 「にに」「はは」もまあまあ誤字
- 「てて」は誤字ではないことが大半
おわりに
本気で Contribution を爆上げしたいのであれば、これだけじゃ足りない
時間みつけて以下を試す
- もっと誤字の辞書を豊富にする
- 目視で結果を確認したあと、ワンクリックでリクエストを送信する仕組み
GitHubの誤字コーパスがあるので、ちょっと調べてみる
参考リンク