2019-07-21に更新

Web版TweetDeckでいいねを自動化した話

タイトルの通りでございます。プログラミング初心者なものでコードは非常に読みにくいものになってるかと思いますが一応ちゃんと動くので許してください。varやらconstやらの使い分けもわかりませんが動きます。

やったこと

  1. まずChromeでTweetDeckを開きます。
  2. WindowsはF12、Macはoption+command+I (アイだよ!) でデベロッパーツールを開きます。
  3. consoleタブに以下のコードを貼り付けてEnterを押します。
const clickHeart = () => {
    const heart = document.getElementsByClassName("js-show-tip tweet-action position-rel");
    const pushed = "js-show-tip tweet-action position-rel anim anim-slower anim-bounce-in";
    var i = 0;
    while ( heart[i].className != pushed && i < 10) {
            heart[i].click();
            i++;
    }
};
setInterval(clickHeart, 1000);

インデントおかしいかもですけどちゃんと動くので(ry

コードの解説

ほんとうの初心者向けの解説です。なんならむしろ僕が教えて欲しいぐらいです。

骨格

const clickHeart = () => {
    //なかみ
};
setInterval(clickHeart, 1000);

clickHeartっていう関数を作って、それを1000ミリ秒(=1秒)ごとに繰り返すって感じです。

clickHeartの中身

    const heart = document.getElementsByClassName("js-show-tip tweet-action position-rel");

いいねするときにクリックするハートアイコンの部分を取得してきます。

    const pushed = "js-show-tip tweet-action position-rel anim anim-slower anim-bounce-in";

この文字列は『いいね済みのハートアイコン』のclass名です。『まだいいねされていないハートアイコン』とはなんか違う感じのclass名ですんで、これを利用して条件分岐を書いていきます。

    var i = 0;
    while ( heart[i].className != pushed && i < 10) {
            heart[i].click();
            i++;
    }

みんな大好きwhile文です。
「heart[i]のclass名とpushedのclass名が違う、つまり、まだ押されてないハートアイコンがあれば上から順に押していってね! いいね済みのハートアイコンまで到達するか10個めまでいいねしちゃったら終わりね!」って感じです。

もうちょっと詳しく説明しておきます。

const heartではTweetDeck上のありとあらゆるハートアイコンを集めてくるわけですが、そのハートアイコンは上から順に0番目,1番目,2番目,3番目...という感じでまとめてくれてます。
なのでTLの一番上のハートアイコンだけを選択したい!というときにはheart[0]とすることでTLのハートを上から並べたときの0番目(JavaScriptでは最初の要素を0から数えるので普通の感覚で言うところの1番目)の要素を選択できるわけです。
今回は「i番目をクリックして」というふうに指定しつつ、while文でiを1つずつ大きくして実行しているので「上から順番に1つずつクリックして」と指示することができるわけです。

そんなわけでもう一度コード全体を見ておきましょう。

const clickHeart = () => {
    const heart = document.getElementsByClassName("js-show-tip tweet-action position-rel");
    const pushed = "js-show-tip tweet-action position-rel anim anim-slower anim-bounce-in";
    var i = 0;
    while ( heart[i].className != pushed && i < 10) {
            heart[i].click();
            i++;
    }
};
setInterval(clickHeart, 1000);

意訳すると「1秒に1回、TLからハートアイコンのデータを集めてきて、その中でまだいいねしてないものを上から順に押して!(でも多くても10個まででいいよ)」となります。

改善できそうなところ

  • なぜか起動した瞬間だけ、いいね済みのところも含めて上から10ツイート分クリックされていいね解除されてしまう(常に起動してればそんなに気にならないけど)。なんでこうなってるのかよくわからないので教えて偉いひと!
  • 処理が重くならないか心配で1秒ごとにしてるけどもうちょっと短くしたり長くしたりしてもいいかも
  • このままだとRTも自動いいねしちゃうけど省けるように頑張りたい(意思)
  • コードの説明のあたりの日本語がちょっと分かりにくいかなーと思うので後で読みやすくしておきます

そもそも自動いいねってやる意味あるの?

  • ある
  • いいねされたら嬉しい
  • 自分がされて嬉しいことは他の人にもしてあげよう!
  • いいねが早いと、された側から覚えられやすくなるし仲良くなれるかもしれない
  • いいね自動化してる人ってあんまりいないからなんか格好いい

感想

僕はほんとにプログラミング初心者で普段もRubyばっか書いてるので終始死にそうになりながら、こんな短いコードを3時間以上かけて書きました。ほんとに。each使いて〜って思いながら。
もう日が昇ってきたので僕は寝ますが、今までの僕と違って今の僕は寝ながらでもいいねする能力を得たので今日は気持ちよく眠れそうです。


tak

Rails初心者です。趣味でぬるっと色々作っていけたらと思ってます。 Twitter @moritaki3488

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

関連記事

コメント