twitterで鍵垢の人の動向が気になる!

きっかけ

ターゲットがツイッターで遊んでないか取り締まりたい!!
ウェブスクライピングしてみたかった!

API使えば?的なはなしは知らん!!
APIだと鍵垢の人の情報持ってこれるんかな?)

やりたいこと

特定ユーザのツイッターを監視してツイートしたら通知をだす!!

実装方法

Pythonでrequestsとlxmlを使ってウェブスクライピングをする!
osはmacです.

requests, lxmlのインストール

pipでいれるだけです

pip install requests
pip install lxml

requestではなく,requestsなので注意!!(間違えてて一瞬はまってた)

しかし,lxmlをインストールしている時に問題発生!

Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?

調べてみたところ,brewでlibxml2がいれれるらしい,
ということでいれてみる.
ついでにlibsxsltもいれておく

brew install libxml2 libxslt

このコマンドを実行したら無事にpipでlxmlがインストールできました.

ちなみに,ウェブスクライピング系のライブラリはけっこうたくさんあるらしく,やりたい人は調べてみるといいかもしれません.

実装

現在のツイート数を持ってくる

ターゲットのURLのhtmlを持ってきて,そこからXpathを指定してツイート数を取得してくる.

まずはターゲットのhtmlを取得

import lxml.html
import requests

TARGET_USER = 'testID'
TARGET_URL = 'https://twitter.com/' + TARGET_USER

# htmlソースコードの取得
html = requests.get(TARGET_URL).text
root = lxml.html.fromstring(html)

やや時間がかかってしまうのは気になるところ・・・

次にツイート数を取得してくる.
どうやらツイート数は

'/html/body/div[contains(@id,"doc")]/div/div/div/div/div/div/div/div/div/div[contains(@class,"ProfileNav")]/ul/li[1]/a/span[2]'

にあるみたいだったので,そこを指定する.
指定の仕方が少し雑な気もするがそこはスルーで!

ついでにとってきたツイート数には"6,439"みたいに間にカンマが入ってるからそれは削除しておく.

TARGET_VALUE_XPATH = '/html/body/div[contains(@id,"doc")]/div/div/div/div/div/div/div/div/div/div[contains(@class,"ProfileNav")]/ul/li[1]/a/span[2]'

# ツイート数が乗っている要素までたどっていく
val = root.xpath(TARGET_VALUE_XPATH)[0].text
tweet_num = int(val.replace(',', ''))

print(tweet_num)

ということで,現在のツイート数を持ってくることは成功!

ツイートしたら通知する

一定時間ごとに現在のツイート数をもってきて,前回と同じ値にならなかったら通知する! あとは大した処理は残っていない!

スリープを挟んだ無限ループで一定時間ごとに監視していきます.
特に大したことはしてないので,詳しくは最後にソースコードをいれときます.

通知部分は適当なサイレン音とともにターゲットがツイッターをしたことを音声で教えてくれることにした!

まとめ

とっさの思いつきで実装した今回のシステムでしたが,思ったよりも簡単にできて個人的には満足した!
この程度のものがウェブスクライピングというかは知りません.
ターゲットがツイートするたびにサイレンがなってけっこうおもしろかった!
うおおおおおおおおおおん!!! (ターゲットの名前)がツイートしました!!

今回のポイントは鍵垢ユーザに対しても監視できる点かなと思います.

ツイートした時間も取得するようにすれば,鍵垢ユーザがいつツイッターしてるかもわかるようになりそう!

ソースコード

import lxml.html
import requests
import time
import os

TARGET_USER = 'testUser'
TARGET_URL = 'https://twitter.com/' + TARGET_USER

TARGET_VALUE_XPATH = '/html/body/div[contains(@id,"doc")]/div/div/div/div/div/div/div/div/div/div[contains(@class,"ProfileNav")]/ul/li[1]/a/span[2]'

AUDIO = 'siren.mp4'
MESSAGE = TARGET_USER + 'がツイッターしています!!!'

def getTweetNum():
    # htmlソースコードの取得
    html = requests.get(TARGET_URL).text
    root = lxml.html.fromstring(html)

    # ツイート数が乗っている要素までたどっていく
    val = root.xpath(TARGET_VALUE_XPATH)[0].text
    return(int(val.replace(',', '')))

def notify():
    os.system('afplay ' + AUDIO)
    os.system('say ' + MESSAGE)

if __name__ == '__main__':
    old_num = getTweetNum()
    while True:
        print(TARGET_USER + 'のツイッター監視中')
        cur_num = getTweetNum()
        if not old_num == cur_num:
            print('ツイートした!!!')
            notify()
        old_num = cur_num
        time.sleep(60)