はるすえすしーのぶろぐ

ブログのないようがないよう

PythonでTwitterのマルコフ連鎖bot(多重人格)を作った話[2/3]

前回までのあらすじ

魔王"マルコフ連鎖"を力を合わせ、謎の老人"MeCab"の助けもありなんとか倒した勇者たち。しかし、魔王は死ぬ間際に真の魔王は他にいると残し消滅した。
勇者たちの旅はまだ続くのであった…

前:マルコフ連鎖をやってみる→https://halss.hatenablog.com/entry/hals_ai1
次:定期的にツイートする→https://halss.hatenablog.com/entry/hals_ai3

2.ツイート収集&ツイート

Twitter Developer登録をする

ツイートを取得したりツイートしたりするにはTwitter Developer登録が必要です。https://developer.twitter.com/にアクセスしてbotツイートをするアカウントでログイン、登録しましょう。(電話番号も必要)
(参考:Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ ※2019年8月時点の情報 - Qiita )
大体1日とか2日くらいで通ると思います。通らなかったらお祓いをしてもう一度書き直しましょう。


通ったらCreate an appでアプリを作成し(名前はなんでもいいです、○○_aiとか)、Consumer API KeysとAccess token & access token secretをどこか大切なところにメモっておきます。大切なので人に見られたらその人を消すしかないですすぐさまRegenerateしましょう。

プログラムからAPIを使ってTwitterをいじる

今回、tweepyとrequests_oauthlibを使います。まだインストールしていない人はpipでインストールします。

$ pip install requests_oauthlib
$ pip install tweepy
練習

「私は神です」とツイートするプログラムを作ってみましょう。
(参考:Pythonでサクッと簡単にTwitterAPIを叩いてみる - Qiita)

# -*- coding: utf-8 -*-
from requests_oauthlib import OAuth1Session
import json

def puttweet():
    #APIの秘密鍵(わかりやすさのために直書きしています)
    CONSUMER_KEY="xxxxxxxxxx"
    CONSUMER_SECRET="xxxxxxxxxxxxx"
    ACCESS_TOKEN_KEY="xxxxxxxxxxxxxxxxxx"
    ACCESS_TOKEN_SECRET="xxxxxxxxxxxxxxx"

    # APIに接続
    twitter = OAuth1Session(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN_KEY, ACCESS_TOKEN_SECRET)

    #ツイート
    params = {"status": "私は神です"}
    req = twitter.post("https://api.twitter.com/1.1/statuses/update.json", params = params)

if __name__=="__main__":
    puttweet()

コマンドプロンプトで実行するだけで投稿できます。クライアント名がアプリ名になっているかも確認してみてください。
文章を変えたければparamsを変更するだけです。

自分の最新ツイート50件を取得する

では、自分の最新ツイートを取得してdata.txtに追加書き込みしてみましょう。
(参考:Tweepy で Twitter の単語を検索する - Qiita)

# -*- coding: utf-8 -*-
import os
import re
import requests
import tweepy

# APIの秘密鍵(実際のプログラムでは環境変数を使っています)
CK,CKS,AT,ATS="xxxxxxxxxxxx","xxxxxxxxxx","xxxxxxxxxxx","xxxxxxxxxxxxxx"

def gettweet(CK, CKS, AT, ATS):

    # APIに接続
    auth = tweepy.OAuthHandler(CK, CKS)
    auth.set_access_token(AT, ATS)
    api = tweepy.API(auth)

    # ユーザを指定してRTを除いた最新50ツイートを取得
    name="ユーザ名"
    results=api.user_timeline(screen_name=name,count=50,include_rts=False)

    f=open(r"data.txt",mode="a",encoding="utf-8")

    for result in results:

        #リンクの削除
        result.text=re.sub(r"https?://[\w/:%#\$&\?\(\)~\.=\+\-…_]+", "" ,result.text)

        #@ツイートの削除(昔仲良くしていたけど今ブロ解された…みたいな人に行くと地獄なので)
        result.text=re.sub("@[\w]+","",result.text)

        #「#peing」「#質問箱」を消す
        result.text=re.sub("#peing","",result.text)
        result.text=re.sub("#質問箱","",result.text)

        #data.txtに追加で書き込み
        f.write(result.text+"\n")

    f.close()

if __name__=="__main__":
    gettweet(CK,CKS,AT,ATS)

data.txtの後ろにツイート文章が追加されていればOKです。ご覧いただきありがとうございました。
次:定期的にツイートする→https://halss.hatenablog.com/entry/hals_ai3