Python twitter

Tweepyでブックマークしたツイートのテキストや画像情報を取得する

この記事は約8分で読めます。

 

案件でTweepyでユーザーのブックマークツイートを取得する機能を作成したのですが、思ったより手間取ったのでやり方をメモしておきます。

 

前準備

 

これは自分もやってみるまで知らなかったのですが、TwitterのAPI経由でブックマークしたツイート情報を取得する際はapi鍵とアクセストークン以外にもoauth認証に使用するoauth2.0のクライアントIDとクライアントSecretが必要になります。

 

まずTwitter開発者用ポータルサイトのプロジェクト内のsettingにある「User authentication settings」をクリックしてリダイレクト用URLを設定する必要があります。(リダイレクト用URLはoauth認証を自作WEBアプリに組み込む、みたいなケース出ない限り適当なURLで大丈夫です。)

 

AppPermissionは「read and write and direct messeage」

type of appは「webapp bot」に設定してください

 

 

URLを設定したら「Keys and tokens」から「OAuth 2.0 Client ID and Client Secret」の項目でClient ID and Client Secretを生成して保存してください。またpermissionを変更した場合は上の4つのアクセスキーと認証トークンも再発行してください(そうしないとpermission設定の変更が反映されません)

 

関連記事:TweepyとTwitter API V2を使って大量のツイート情報をスクレイピングする

 

 

Tweepyでユーザーのブックマークツイートを取得する

 

前準備が終わったので実際にTweepyでブックマークツイートを取得したいと思います。

tweepyはバージョンで関数の書き方が変わるので、この記事ではtweepy==4.10.0を使用しています。

 

$ pip install tweepy==4.10.0

 

関連記事:Tweepyで 「API object has no attribute search」のエラー出る原因と解決法

 

まずは認証部分、各種トークンは自分のものに置き換えてください

 

import tweepy
from datetime import datetime
from datetime import timedelta
import json
import requests
import traceback
import os
import pandas as pd

# ライブラリのバージョン確認 tweepyのバージョンは4.10.0です
print(f'tweepyのバージョンは{tweepy.__version__}です')

consumer_key = 'xxxx'
consumer_secret = 'xxxx'
access_token_secret = 'xxxx'
access_token = 'xxxx'

# oauth認証
oauth2_user_handler = tweepy.OAuth2UserHandler(
client_id='xxxx',
redirect_uri="https://tkstock.site/",
scope=["bookmark.read", "bookmark.write",
"tweet.read","users.read"],
# Client Secret is only necessary if using a confidential client
client_secret='xxxx'
)

 

ここで肝心なのは以下のコードでブックマークをOauth認証で読み取る際の権限を指定してあげる必要があります。ここでこの4つを指定しないと認証後にブックマークをclient.get_bookmarksで取得しようとして403 forbiddenになってしまうので注意してください

 

scope=[“bookmark.read”, “bookmark.write”,
“tweet.read”,”users.read”],

 

ちなみにスコープのリストについては、Tweepyの公式ドキュメントとTwitter の OAuth 2.0 Authorization Code Flow with PKCE ドキュメントの Scopes セクションを参照してください。

 

参考:https://developer.twitter.com/en/docs/authentication/oauth-2-0/authorization-code

参考:https://docs.tweepy.org/en/stable/authentication.html

 

# 次に認証 URL を取得します。

print(oauth2_user_handler.get_authorization_url())

 

#これを使用して、ユーザーにアプリを認証させることができます。完了すると、定したコールバック / リダイレクト URI / URL にリダイレクトされますので、その認証応答URLをINPUT文で渡してください。

 

すると戻り値の変数access_tokenの中のAPIレスポンスのdictの中にアクセストークンが格納されているので、それを再度input文の入力欄に張り付けてプログラムを実行してください。

 

ちなみにINPUT文を使っているのはoauth認証によるトークン認証を使っているのでそのままURLを叩くと「CSRF 検証に失敗したため、リクエストは中断されました」的なCSRF エラーが起こるためです。多分頑張ればinputを使わなくてもいい気がしますが、自分的にはこれで目的な達成したのでそれ以上は調べていません。

 

# Clientその後、初期化時にアクセス トークンを渡すことができます。

verifier = input("Enter whole callback URL: ")

access_token = oauth2_user_handler.fetch_token(verifier)

print("The returned access token is ", access_token)

accessCopy = input("Copy paste the access token here \n >")

client = tweepy.Client(accessCopy)

response = client.get_bookmarks(
expansions="author_id,attachments.media_keys",
tweet_fields="created_at,public_metrics,attachments",
user_fields="username,name,profile_image_url",
media_fields="public_metrics,url,height,width,alt_text")
# print(response)

tweets = response.data

users = {}
for user in response.includes['users']:
users[user.id] = f"{user.name} (@{user.username}) [{user.profile_image_url}]"

# process media attachment
media = {}
if 'media' in response.includes:
for item in response.includes['media']:
media[item.media_key] = f"{item.url} - {item.height}x{item.width} - Alt: {item.alt_text}"

tweets = response.data

# The expanded tweet offers a lot more data
for tweet in tweets:
    print('-' * 50)
    print(f"{tweet.id} ({tweet.created_at}) - {users[tweet.author_id]}:\n {tweet.text} \n")
    metric = tweet.public_metrics
    print(f"retweets: {metric['retweet_count']} | likes: {metric['like_count']}")
    if tweet.attachments is not None:
        for media_key in tweet.attachments['media_keys']:
            print(f"Media attachment: #{media[media_key]}")

 

これでブックマークしたツイートのテキストと画像がある場合は画像のURLが取得できます。

保存したいは空のリストか何かを作って、appendしていけばよいと思います。

 

参照:https://docs.tweepy.org/en/stable/client.html#users

参照:https://stackoverflow.com/questions/73027084/tweepy-error-with-bookmarks-typeerror-unhashable-type-oauth2token

参照:https://improveandrepeat.com/2022/07/python-friday-131-working-with-bookmarks-in-tweepy/


プログラミング・スクレイピングツール作成の相談を受け付けています!

クラウドワークス・ココナラ・MENTAなどでPython・SQL・GASなどのプログラミングに関する相談やツール作成などを承っております!

過去の案件事例:

  • Twitter・インスタグラムの自動化ツール作成
  • ウェブサイトのスクレイピングサポート
  • ダッシュボード・サイト作成
  • データエンジニア転職相談

これまでの案件例を見る

キャリア相談もお気軽に!文系学部卒からエンジニア・データサイエンティストへの転職経験をもとに、未経験者がどう進むべきかのアドバイスを提供します。


スポンサーリンク
/* プログラミング速報関連記事一覧表示 */
ミナピピンの研究室

コメント

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