ほぼPython

Not技術ブログBut勉強ブログ 内容には誤りがあることが多いです

Twitterで特定アカウントを監視し、写真/動画付きツイートがされたら自動で保存するプログラムを書いた

追記

ここのコードだとエラーが多いので改良しました
short4010.hatenablog.com



はじめに

今回は、Pythonを使って、ツイッター特定アカウントを監視し、画像/動画付きツイートがされたら自動で保存するというストーキングに最適なプログラムを書きました。

こういうのは、いわゆる裏垢界隈からは需要高そうな気がする。というのも、裏垢女子アカウント(自称)が #すぐ消す というハッシュタグ付きで「すぐに消さねばいけないような画像や動画」をアップする傾向にあると小耳に挟んだからである。

既に件の画像/動画は消去済みで、でもリプライからどうやら「すぐに消さねばならないような画像や動画」がアップされていたと知ったとき、きっと裏垢男子たちは辛酸をなめる思いであったことだろう…。

そんな彼らの悩みを解決してあげようと思い、今回の開発に至った。(というのは後付けで、本当はふぁぼしたツイートの動画を保存するっていうプログラムを書きたかったんだけどちょっと難しそうだったからとりあえず前回作ったプログラムをちょっと改良すればできるこのプログラムを作っただけです)ちなみに、開発には3時間かかった。

ソース

from requests_oauthlib import OAuth1Session
import json
from datetime import datetime
import urllib.request
import re
import random
import time

keys = {
            "CK":'カスタマーキー',
            "CS":'カスタマーキーシークレット',
            "AT":'アクセストークン',
            "AS":'アクセストークンシークレット'
        }

sess = OAuth1Session(keys["CK"], keys["CS"], keys["AT"], keys["AS"])
TL = "https://api.twitter.com/1.1/statuses/user_timeline.json"
userID = "監視したいユーザーのアカウント名(@は、いらない)"

params = {
"screen_name":userID,
"count":1,
"include_entities" : True,
"exclude_replies" : True,
"include_rts" : False
          }

def getTL():
    global req, timeline, content
    req = sess.get(TL, params=params)
    timeline = json.loads(req.text)
    content = timeline[0]

def getContents():
    if "extended_entities" in content: #extended_entitiesがある→画像か動画付きツイート
        content_check = content["extended_entities"]["media"][0]
        if "video_info" in content_check:
            video_url = content["extended_entities"]["media"][0]["video_info"]["variants"][1]["url"]
            nowtime = str(datetime.now())
            time_modify1 = re.sub("-|:| ", "", nowtime)
            time_modify2 = time_modify1[:12]+"R"+str(random.randint(1,1000))
            title = time_modify2+".mp4" #とりあえず画像はすべてmp4で保存
            urllib.request.urlretrieve(video_url,title)
            print(video_url)
        else: #動画が含まれていないのにextended_entitiesがある→画像がある
            image_url = content["extended_entities"]["media"][0]["media_url"]
            nowtime = str(datetime.now())
            time_modify1 = re.sub("-|:| ", "", nowtime)
            time_modify2 = time_modify1[:12]+"R"+str(random.randint(1,1000))
            title = time_modify2+".jpeg" #とりあえず画像はすべてjpegで保存
            urllib.request.urlretrieve(image_url,title)
            print(image_url)
    else:
        print("画像も動画も含まれていません")

first =0
while True:
    if first==0:
        getTL()
        getContents()
        oldTwit = timeline[0]["text"]
        first += 1
    elif first==1:
        getTL()
        newTwit = timeline[0]["text"]
        if oldTwit != newTwit:
            first += 1
        elif oldTwit == newTwit:
            print("更新されていません")
            first = 1
    elif first==2:
        getContents()
        oldTwit = timeline[0]["text"]
        first -= 1
    time.sleep(60)

ざっくりとした仕様

特定アカウントのツイートを約1分間に1度のペースで監視する。
もし、監視中にツイートが更新され、なおかつそのツイートに画像か動画が添付されていた場合、そのデータを保存する。
ファイル名は「年月日時間R0~1000までの乱数.拡張子」となる。保存形式はそれぞれjpeg/mp4である。

問題点

Twitter APIの規制に引っかからないよう常時監視ではなく1分間に一度のペースである。そのため、現在の仕様だと最新ツイートの読み込みしか行わないので、1分間の間に複数回の画像/動画付きツイートをした場合、その中で最新のものしか保存できない。
・例外処理を行っていないので予期せぬエラーが起きたら止まってしまう。
・基本的に鍵垢に対しては実行できない。
・10分間程度のテストしか行っていないためどれくらい使い物になるかは不明。

感想

Pythonは楽しい!!!!今回はじめて関数を作った!