【PythonコピペでOK】txtから読み込んだURLをページタイトルとハッシュタグ付きでXに投稿するPythonコード

※本記事はコードが読める人向けの記事です。

 タイトルの通り『txtから読み込んだURLをページタイトルとハッシュタグ付きでXに投稿するPythonコード』です。

 いつからは知りませんが、GoogleニュースのRSSからジャンプ先URLがスクレイピング取得できなくなったので、テキストファイルから読み込んだURLからページタイトルを取得して、ハッシュタグと一緒にポストするコードに仕様を変更しました。

 ポストされる内容は「ページタイトル+ハッシュタグ+URL+URL」です。URLは2列分テキストに含まれますが表示されるのは1列分だけです。現在のXの仕様だと1列だけですと、文章上に表示されないためです。逆にURLを文章に表記させたくない場合は63行目の{final_url}を1つ削ってください。

 以下がコードです。設定箇所は下記の通り。
 自己責任でつかってください。

  • 11行目〜14行目:XのAPI情報
  • 63行目:ハッシュタグを入力
  • 75行目:URL情報のtxtファイルのパス
  • 82行目:ポストされる時間。初期の状態は0時6時12時18時にポストされます。

 ポスト時間について補足です。このコードはLolipopサーバーのcronで動かすことを前提にしています。cronを毎時0時0分に設定し、毎時0分にコードが実行されるが、コード上で設定した時間のみポストされるという使い方です。

#!/usr/local/bin/python3.7
# -*- coding: utf-8 -*-

import tweepy
import requests
from bs4 import BeautifulSoup
import random
import datetime

# APIキーとアクセストークンの設定
api_key_common = 'XXXXXXXXXX'
api_key_secret_common = 'XXXXXXXXXX'
access_token_common = 'XXXXXXXXXX'
access_token_secret_common = 'XXXXXXXXXX'

# APIの設定
client = tweepy.Client(
    consumer_key=api_key_common,
    consumer_secret=api_key_secret_common,
    access_token=access_token_common,
    access_token_secret=access_token_secret_common
)

# ジャンプ先のURLを取得する関数
def get_final_url(url):
    try:
        response = requests.head(url, allow_redirects=True, timeout=5)  # 5秒のタイムアウトを設定
        return response.url
    except requests.exceptions.RequestException as e:
        print("ジャンプ先のURLを取得できませんでした:", e)
        return None

# ジャンプ先のページのタイトルを取得する関数
def get_page_title(url):
    try:
        response = requests.get(url, timeout=5)  # 5秒のタイムアウトを設定
        soup = BeautifulSoup(response.content, 'html.parser')
        return soup.title.string
    except requests.exceptions.RequestException as e:
        print("ページタイトルを取得できませんでした:", e)
        return None

# テキストファイルからURLを読み込む関数
def read_urls_from_file(file_path):
    try:
        with open(file_path, 'r') as file:
            urls = file.readlines()
            urls = [url.strip() for url in urls if url.strip()]  # 各行の前後の空白を除去
            return urls
    except FileNotFoundError:
        print(f"ファイルが見つかりません: {file_path}")
        return []

# ランダムに1つのURLを選んでツイートする関数
def tweet_random_url(urls):
    if urls:
        max_attempts = 5  # 最大試行回数
        for attempt in range(max_attempts):
            print(f"試行 {attempt + 1} 回目")

            # ランダムに1つのURLを選択
            selected_url = random.choice(urls)
            final_url = get_final_url(selected_url)

            if final_url:
                page_title = get_page_title(final_url)
                tweet_text = f"{page_title if page_title else 'タイトルなし'} #ハッシュタグ\n{final_url}\n{final_url}"
                
                # ツイートを投稿
                client.create_tweet(text=tweet_text)
                print("投稿しました:", final_url)
                break  # 成功したらループを抜ける
            else:
                print("ジャンプ先のURLを取得できませんでした。")

            # 5回目の試行でも成功しなければ終了
            if attempt == max_attempts - 1:
                print("全ての試行が失敗しました。プログラムを終了します。")
    else:
        print("URLが見つかりませんでした。")

# メイン処理
def main():
    file_path = '/XXXXXXXXXX/XXXXXXXXXX/XXXX.txt'
    urls = read_urls_from_file(file_path)
    tweet_random_url(urls)

# 指定した時間に一度だけツイートを投稿する関数
def schedule_tweet():
    current_hour = datetime.datetime.now().hour  # 現在の時間を取得
    if current_hour in [0, 6, 12, 18]:
        main()
    else:
        print("投稿のスケジュール時間外です。")

if __name__ == "__main__":
    schedule_tweet()

 なお、txtファイルの内容は以下のように、1行1URLでURL情報が書き込まれたものならOKです。

………………………………
https://example1.com/
https://example2.com/
https://example3.com/



………………………………

という感じです。

コメント

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