世紀末の墓

世紀末の墓

IT系寄りの雑記

neta-ru[.]comを含むツイート主をブロックする

はじめに

Twitterあるじゃん?パクツイあるじゃん?neta-ru[.]comのページが良くぶら下げられてることあるじゃん?目触りじゃん?

ブロックしちゃうか^^

とはいえ、手動でやるなんてそんなクソ面倒なことしてらんないじゃん?ということでコードを書きました。

準備

python3の動くコンピュータがあればOK
自動定期実行するならファイルを置くサーバ(ラズパイでもなんでも常に起動してるコンピュータ)
僕はVPS(amazon lightsail)/centOS7を使います。

関連モジュールを入れる

$ pip3 install requests requests-oauthlib

僕の環境ではpython2系と3系が共存しているので、pip3ですが、3系しか入ってないのであればpipでも動くはず。

コード

## main.py ##
import json
from requests_oauthlib import OAuth1Session

import keys
from search_word import searchWord
from get_userid import getUserids
from block_user import blockUsers

import datetime

# from keys.py
CK = keys.CONSUMER_KEY
CS = keys.CONSUMER_SECRET
AT = keys.ACCESS_TOKEN
ATS = keys.ACCESS_TOKEN_SECRET

# 認証
twitter = OAuth1Session(CK, CS, AT, ATS)

# 検索
result = searchWord(twitter, "url:neta+ru.com exclude:retweets", 100)

if result != [] :
    # userid(@hogehogeみたいなやつ)をtweetデータから取り出す
    user_ids = getUserids(result)
    # ↑で取り出したuseridを指定してブロック
    blockUsers(twitter, user_ids)

    # log用出力
    print("-----------------------------")
    print(datetime.date.today())
    print(user_ids)
else :
    print("-----------------------------")
    print(datetime.date.today())
    print("error")
## search_word.py ##
import json

def searchWord(twitter, word, cnt) :
    url = "https://api.twitter.com/1.1/search/tweets.json"

    params = {'q': word, 'count':cnt, 'result_type':'recent'}

    req = twitter.get(url, params = params)

    if req.status_code == 200 :
        searchResults = json.loads(req.text)
        return searchResults['statuses']
    else :
        print("ERROR: %d" % req.status_code)
        return []
## get_userid.py ##
def getUserids(result) :
    id_list = []
    for tweet in result :
        user_id = tweet['user']['screen_name']
        if not(user_id in id_list) :
            id_list.append(user_id)

    return id_list
## block_users.py ##
def blockUsers(twitter, user_ids) :
    url = "https://api.twitter.com/1.1/blocks/create.json"

    for user_id in user_ids:
        params = {'screen_name': user_id}
        twitter.post(url, params = params)

main.pyではkeys.pyからtoken情報を持ってきています。
適宜変えてください。

ツイートデータにはURLはt[.]co形式の短縮URLになって組み込まれているため検索が難しいのですが、url:を指定することで、元のURLで検索できます。exclude:retweetsでRTを除外しています。

定期実行

これは実行時に100件検索してきてブロックするものなので、定期的に実行する必要があります。twitterAPIでは指定したtweetIDから検索することが可能なので、ページング処理して以前のツイートすべてを調べることが可能です。ただ、面倒だったし結局最初以外は定期的に処理していくしかないので、以前のは諦めてこれからのやつを適宜調べていくことにしました。

いまcentOS7を使っているのでcronを使って毎日0時に実行されるようにしました。 cronの設定方法については記事が豊富なので書かないですが、1日ごとの実行であれば、/etc/cron.daily/の下にスクリプトを登録すればOKです。