Panda Noir

JavaScript の限界を究めるブログです。

PyQt5を使って手探りでツイッタークライアントを作る vol.3

いよいよ今回ロジック部分を作ります!これでツイート機能のついた(ツイート機能しかない)クライアントが完成します!

Twitterのconsumer keyと consumer secretを取得

TwitterのAPIを使用するために必要なキーを取得する手順 - Hello API

この記事がわかりやすいです。今回access tokenと access token secretは不要(ツイッタークライアントなのでそりゃそうです)なので、1~4を行ってください。

ここで一つ注意があります。今回、Pythonでクライアントを作るのでPINコード認証が必要です。しかし、Callback URLが書いてあるとPINコード画面ではなく、そのURLへと飛ばされてしまいます。だから、Callback URLはからのままにしておいてください。

Callback URLは空にしておいてください

ログインしてみる

では実際にPINコードでログインしてみます。

import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import *

if __name__ == '__main__':
    app = QApplication(sys.argv)

    import webbrowser
    import tweepy
    CONSUMER_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxx" # 先ほどのconsumer key
    CONSUMER_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 先ほどのconsumer secret
    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)

    redirect_url = auth.get_authorization_url()
    webbrowser.open(redirect_url) # 認証画面を表示する

    verifier, ok = QInputDialog.getText(None, 'PIN code', 'input pin code') # PINコード入力用ダイアログ
    verifier = verifier.strip()

    auth.get_access_token(verifier)
    ACCESS_TOKEN = auth.access_token
    ACCESS_SECRET = auth.access_token_secret

    auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
    api = tweepy.API(auth)

    sys.exit(app.exec_())

実行するとダイアログが出て、ブラウザが開き、認証画面が出るはずです。出ましたか?

これでログイン部分はできました。

ツイートしてみる

先ほどのapiを使ってツイートしてみましょう。

    api = tweepy.API(auth)
    try:
        req = api.update_status('ツイッタークライアントのテスト')
    except Exception as e:
        print(e)

ツイッターをみて、ツイートできていたら成功です。

前回のコードと組み合わせる準備

前回のコードと組み合わせてる前に、前回説明してなかった部分を説明しておきます。

ボタンにイベントリスナをつける

ボタンにイベントを貼り付ける方法です。といっても難しくはないです。

button.clicked.connect(func)

テキストボックスからテキストを取得

これも説明してませんでした。

textbox.toPlainText()

前回のコードと組み合わせる

いよいよ(簡単なものではありますが)ツイッタークライアントの完成です!

import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
import webbrowser
import tweepy

class TweetWindow(QWidget):
    def __init__(self, parent = None):
        super(TweetWindow, self).__init__(parent)
        self.initLayout()
        self.initTwitterAccount()
    def initLayout(self):
        textbox = QPlainTextEdit()

        button = QPushButton()
        button.setText('tweet')
        button.clicked.connect(lambda: self.tweet(textbox.toPlainText())) # ボタンをクリックしたら、テキストボックスの内容を使ってツイートする

        layout = QVBoxLayout()
        layout.addWidget(textbox)
        layout.addWidget(button)

        self.setLayout(layout)
    def initTwitterAccount(self):
        CONSUMER_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxx" # 先ほどのconsumer key
        CONSUMER_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 先ほどのconsumer secret
        auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)

        redirect_url = auth.get_authorization_url()
        webbrowser.open(redirect_url) # 認証画面を表示する

        verifier, ok = QInputDialog.getText(None, 'PIN code', 'input pin code') # PINコード入力用ダイアログ
        verifier = verifier.strip()

        auth.get_access_token(verifier)
        ACCESS_TOKEN = auth.access_token
        ACCESS_SECRET = auth.access_token_secret

        auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
        self.api = tweepy.API(auth)

    def tweet(self, text):
        try:
            req = self.api.update_status(text)
        except Exception as e:
            print(e)


if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = TweetWindow()

    window.show()
    sys.exit(app.exec_())

どうですか?動きましたか?

次回予告

次回は「起動するたびに認証する」という手間から解放する作業です。たぶん次の次からタイムラインの表示に取り掛かります。