※本記事はコードが読める人向けの記事です。
タイトルの通り『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/
・
・
・
………………………………
という感じです。
コメント