Better Software Testing

ソフトウェアテストをもっと良くしたい

はてなブログの記事を無作為に選択、ツイートするbotを作った

まぁ大した記事なんて書いてないわけだけど、それでも、せっかく書いたものを腐らせておくのは勿体無いなぁと思った次第。
だらだら書いて丸一日かけてしまったけど、やってることは特に難しくない。


実行フロー:

  1. はてなブログAPIを使って、最新記事10件の情報(タイトル、URL、その他)を取得する(はてなブログAtomPub - Hatena Developer Center
  2. 最新記事10件の中から1件を無作為に選択する
  3. 選択した記事のURLをtwitterに投稿する(Twitter API | Products | Twitter Developer Platform

これをAWS lambdaにセットし、毎朝9:00に実行するというもの。
せっかくなのでソースコードを公開しておきます。
python50行弱で書けたので、興味のある人はやってみるとよいと思う(記事最下部参照)。
いやー、年末年始休暇の工作としてはちょうどいい感じだったな。
ちょっとした達成感が得られてよかった。

f:id:katsu-ichiro:20211231100105p:plain
実行例
import requests
import xml.etree.ElementTree as ET
import random
import tweepy
import datetime

def tweet_random_post_title_and_link(tweet_message):
    # 認証に必要なキーとトークン
    API_KEY = 'XXXXXXXXXXXXXX'
    API_SECRET = 'XXXXXXXXXXXXXX'
    ACCESS_TOKEN = 'XXXXXXXXXXXXXX'
    ACCESS_TOKEN_SECRET = 'XXXXXXXXXXXXXX'

    auth = tweepy.OAuthHandler(API_KEY, API_SECRET)
    auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
    api = tweepy.API(auth)
    api.update_status(tweet_message)

def get_random_post_title_and_link():
    url = "https://blog.hatena.ne.jp/katsu-ichiro/better-software-testing.hatenablog.com/atom/entry"

    payload={}
    headers = {
    'Authorization': 'Basic XXXXXXXXXXXXXX',
    'Cookie': 'b=XXXXXXXXXXXXXX; sk=XXXXXXXXXXXXXX'
    }

    response = requests.request("GET", url, headers=headers, data=payload)
    root = ET.fromstring(response.text)
    index = random.randint(0,9)
    entry = root.findall("{http://www.w3.org/2005/Atom}entry")[index]
    link = entry.findall("{http://www.w3.org/2005/Atom}link")[1].attrib['href']
    title = entry.find("{http://www.w3.org/2005/Atom}title").text
    post_info_dict = {
        "title": title,
        "link": link
    }
    return post_info_dict

post_info_dict = get_random_post_title_and_link()
print(post_info_dict["title"] + " : " + post_info_dict["link"])
today = datetime.date.today()
tweet_random_post_title_and_link(today.strftime('%Y年%m月%d日') + "のおすすめ" + post_info_dict["link"])