Twitter APIを使わずにPythonで自動ツイートを実現

Twitter APIを使わずにPythonで自動ツイートを実現 プログラミング

TwitterのAPIを使えば、プログラムによる自動ツイートが簡単にできます。
でも、TwitterはAPIの申請が面倒で嫌になります。

それなら、APIを使わずに自動ツイートを行えばいいのです。
ということで、この記事ではAPIなしの自動ツイートに関して解説していきます。

本記事の内容

  • Twitter APIを使わずに自動ツイートする方法
  • Twitterへのログイン
  • Twitterにログインした状態でツイート
  • 【サンプルコード】Twitter APIなしの自動ツイート

それでは、上記に沿って解説していきます。

Twitter APIを使わずに自動ツイートする方法

まずは、全体像を説明します。

ツイートするためには、ログイン済みが前提となります。
ログインしている状況でしかツイートはできませんからね。

つまり、自動ツイートとは以下の機能に分解できます。

  • Twitterへのログイン
  • Twitterにログインした状態でツイート

この機能を満たすプログラムであれば、自動ツイートが可能になります。
このようなプログラムを可能にするには、Seleniumを利用します。

Seleniumのインストールは、次の記事で解説しています。

あと、タイトルにも書いているようにPythonを開発言語とします。
Pythonは、このような自動処理に最も適したプログラム言語と言えます。

以上、Twitter APIを使わずに自動ツイートする方法の全体像を説明しました。
次は、分解した機能の一つである「Twitterへのログイン」を説明します。

Twitterへのログイン

詳細は、次の記事をご覧ください。

上記記事の内容通りに、ライブラリなども用意してください。

以上、Twitterへのログインに関する説明でした。
次は、プログラムによってツイートを行う方法を説明していきます。

Twitterにログインした状態でツイート

実は、簡単です。

これは、Twitterのシェアボタンです。
今では、大抵のページで目にします。

このシェアボタンの仕組みを利用するのです。
例えば、以下のページのシェアボタンをクリックします。

https://this.kiji.is/759887978843619328

すると、次の表示の画面に遷移します。

上の画面のURLは、以下となります。

 https://twitter.com/intent/tweet?text=%E7%B1%B3%E3%82%B0%E3%83%BC%E3%82%B0%E3%83%AB%E3%80%81%E9%81%8E%E5%8E%BB%E6%9C%80%E9%AB%98%E7%9B%8A%E3%80%80%E3%82%B3%E3%83%AD%E3%83%8A%E8%BF%BD%E3%81%84%E9%A2%A8%E3%80%81MS%E3%82%82%E5%A5%BD%E8%AA%BF+%7C+2021%2F4%2F28+-+%E5%85%B1%E5%90%8C%E9%80%9A%E4%BF%A1&url=https%3A%2F%2Fthis.kiji.is%2F759887978843619328 

このURLは、以下の形式で表現されています。

https://twitter.com/intent/tweet?text=テキスト&url=対象ページURL

この形式のURLが、シェアボタンに設定されているだけです。
そのため、私たちもシェアボタンの仕組みを利用します。

上記形式のURLに遷移すれば、入力までは完了していることになります。
あとは、「Tweet(ツイートする)」ボタンを押すだけです。

「Tweet」ボタンを押すのは、Seleniumを利用します。
ボタンを押せば、これでツイートの投稿が完了になります・

以上、Twitterにログインした状態でツイートすることを説明しました。
次は、実際にTwitter APIなしの自動ツイートを行っていきます。

Twitter APIなしの自動ツイート

以下のサンプルコードは、Twitter APIなしの自動ツイートを行います。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import urllib.parse


CHROMEDRIVER = "chromedriver.exeのパス"
TWITTER_BASE = "https://twitter.com/"
LOGIN_ID = "メールアドレスとかユーザ名"
PASSWORD = "パスワード"


def get_driver():
    #  ヘッドレスモードでブラウザを起動
    options = Options()
    # options.add_argument('--headless')
    # ブラウザーを起動
    driver = webdriver.Chrome(CHROMEDRIVER, options=options)

    return driver


# twitterログイン
def do_login(driver):
    # ログインURL
    login_url = TWITTER_BASE + "login"
    driver.get(login_url)

    # 電話、メールまたはユーザー名のinput要素が読み込まれるまで待機(最大10秒)
    elem_id = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.NAME, "session[username_or_email]"))
    )

    try:
        # パスワードのinput要素
        elem_password = driver.find_element_by_name("session[password]")

        if elem_id and elem_password:

            # ログインID入力
            elem_id.send_keys(LOGIN_ID)

            # パスワード入力
            elem_password.send_keys(PASSWORD)

            # ログインボタンクリック
            elem_btn = WebDriverWait(driver, 10).until(
                EC.visibility_of_element_located((By.XPATH, "//div[@data-testid='LoginForm_Login_Button']"))
            )

            actions = ActionChains(driver)
            actions.move_to_element(elem_btn)
            actions.click(elem_btn)
            actions.perform()

            # 遷移
            # 遷移後のURLでログイン可否をチェック
            perform_url = driver.current_url

            if perform_url.find(login_url) == -1:
                # ログイン成功
                return True
            else:
                # ログイン失敗
                return False

        else:
            return False
    except:
        return False


# tweet投稿
def post_tweet(driver, text, url):

    tweet_text = text
    tweet_text = urllib.parse.quote(tweet_text, safe='')

    tweet_url = url
    tweet_url = urllib.parse.quote(tweet_url, safe='')

    target_url = TWITTER_BASE + "intent/tweet?text=" + tweet_text + "&url=" + tweet_url

    # 投稿画面へ遷移
    driver.get(target_url)

    # tweetボタンが読み込まれるまで待機(最大10秒)
    elem_tweet_btn = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.XPATH, "//div[@data-testid='tweetButton']"))
    )

    try:
        actions = ActionChains(driver)
        actions.move_to_element(elem_tweet_btn)
        actions.click(elem_tweet_btn)
        actions.perform()

    except:
        print("投稿エラー")

if __name__ == "__main__":
    # Driver
    driver = get_driver()

    # ログイン
    login_flg = do_login(driver)

    if login_flg:
        # ログイン成功

        text = "投稿テストを行います"
        url = "https://this.kiji.is/759884204002656256"

        post_tweet(driver, text, url)

    # driver.quit()

「Twitterにプログラムで自動ログインする【Python + Selenium】」のサンプルコードとほぼ同じです。
異なる箇所は以下の部分だけです。

    if login_flg:
        # ログイン成功

        text = "投稿テストを行います"
        url = "https://this.kiji.is/759884204002656256"

        post_tweet(driver, text, url)

もちろん、post_tweet関数も新規で追加しています。
post_tweet関数に関しては、自動ログインと同じロジックです。

post_tweet関数で説明がいるとすれば、「urllib.parse.quote」でURLエンコードしていることでしょうか。
あと、それに伴ってurllib.parseをimportしています。

import urllib.parse

自動ログインのサンプルコードさえ理解できれば、今回は何も難しいことはありません。
では、上記のサンプルコードを実行してみましょう。

普通に投稿が行われます。
そして、ツイートとしても確認できます。

以上、Twitter APIなしの自動ツイートについて説明しました。

タイトルとURLをコピーしました