Open3

TweepyとTwitter-apiでいろいろ遊んでみた

Kumamoto-HamachiKumamoto-Hamachi

下準備その1 Twitter api申請(今度まとめて書く)

英文での申請手順及び回答例

下記の質問に答えていく。ある程度以上(300文字)の文字数で書かないと後日メールにて
詳細を教えてと追加質問が来る。(3回程度でクリアしないとリジェクトされてしまうのでちゃんと答えよう!)

  • 1問目 how I plan to use Twitter data and/or APIs
    「Twitterのデータ及びAPIをどのように使う予定ですか?」という質問。
    私は下記のように回答しました。
    [和文]
    私は、自社の製品や自身をプロモートする目的でTwitterを運用する人たちのためのサービスを開発しています。

私が自分のサービスにTwitter apiを使用したいのは主に以下2つの理由からです。

第一に、サービスの登録/ログインにOpenid Connectを用いたいからです。私のサービスはTwitterのユーザー向けであり、彼らがユーザー登録やログインをストレスなく出来るようにするにはこのやり方が良いと考えました。

第二に、

[英文]
I'm developing a service for Twitter users especially who are looking to promote themselves and their products.

I wanted to use Twitter APIs in my service for two main reasons.

Firstly, I want to use Twitter authentication (OpenID Connect) to register and login to the service.
My service is for Twitter users. Therefore, I need a function that allows Twitter users to register and log in without stress. Therefore, the feature, “authentication with a Twitter account” is a must for my service.

Secondly, I want to make it easy for users of the service to identify accounts that have unfollowed them and to unfollow or block them from within the service.
The core value of this service is to make it easy to identify which accounts to unfollow.
This feature is especially useful for users who want to improve their follow/follower ratio.

For these reasons, Twitter APIs are essential to the service I'm currently developing.

[和文]
[英文]

Kumamoto-HamachiKumamoto-Hamachi

下準備その2 tweepyのインストールやAPIキーの取得

APIキー、アクセストークンなどの取得(今度書く)

まずはデベロッパー向けのページにアクセスしましょう。

デベロッパー向けページ右上の『Developer Portal』をクリックしてダッシュボードにアクセスします。

ダッシュボードの中の

APIキーなどgitに上げたくない情報を環境変数に設定する

APIキーをハードコーディング[hard coding:本来プログラム中に記述すべきでないリソース(エラーメッセージなど)を、直接ソースコード中に埋め込むこと]してしまいそれをgit管理にしてしまうとGitHubなどのホスティングサービスに丸裸のまま公開されるリスクがある。今回はそうしたリスクを避けるため外部APIキーを環境変数に入れてgit管理下から話したシェルスクリプトファイルに保存することにしよう。

まず環境変数を設定するシェルスクリプトのファイルを作成

ホームディレクトリに.shファイルを作成(筆者はtwit.shという名前にした。)
.shファイル内に環境変数を設定していく

echo "twit.sh stands up"
# for 自分のアプリ
export CUS_KEY="******"
export CUS_KEY_SECRET="******"
# for 自分のアカウント
export ACS_TOKEN="******"
export ACS_TOKEN_SECRET="******"

※普段のプログラミングの感覚で=の間にスペースを開けたりしないこと

これが無事呼ばれるか念のためテストしよう。

$ bash twit.sh
twit.sh stands up

###つぎに作成したシェルスクリプトがターミナル の立ち上げのたびに呼ばれるようにする。
まずは.bash_profileに下記を追加。

echo ".bash_porfile stands up"
# load .bash_rc
if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

これでbashにログインしたときに.bashrcが読み込まれる。
次に.bashrcに下記を追記。

echo ".bashrc stands up"
# load twit.sh
if [ -e ~/twit.sh ]; then
	source ~/twit.sh
fi

これで.bashrcが読み込まれたときにtwit.shが読み込まれる。
念のためこれもテストしよう。

$ bash
.bashrc stands up
twit.sh stands up

問題なさそうなので次へ。

tweepyのインストール

$ pip install tweepy
$ pip list | grep tweepy
tweepy            3.9.0
Kumamoto-HamachiKumamoto-Hamachi

Tweepyで遊ぶ(どんどん追記していこう)

いきなり番外編 Python: オブジェクトのメソッド一覧を取得する

Tweepyと直接の関係はないが調査のとっかかりように便利。
※参考サイト:Python: オブジェクトのメソッド一覧を取得する

for x in dir(obj):
    print (x, ':', type(eval("obj."+x)))

設定した外部APIキーを呼び出す

以後以下のコードが記述済とする。

import os
import tweepy

CK = os.environ['CUS_KEY']
CS = os.environ['CUS_KEY_SECRET']
AT = os.environ['ACS_TOKEN']
AS = os.environ['ACS_TOKEN_SECRET']

Twitter apiオブジェクトを作る。

以後以下のコードが記述済とする。

def create_api():
    auth = tweepy.OAuthHandler(CK, CS)
    auth.set_access_token(AT, AS)
    api = tweepy.API(auth)
    return api

ツイートする

# 普通のツイート
api.update_status("Pythonからの投稿")

# 特定のツイートへのリプライ
api.update_status("Pythonからのリプ", ステータスID[in_reply_to_status_id])

※ちなみにstatus-idは下記の画像で言うと下記赤線部分です。

画像付きでツイートする

同じディレクトリにiterm.pngという画像があるとする。

api.update_with_media(status="Pythonからの画像付きの投稿", filename="./iterm.png")

タイムラインに流れているツイートを見る(上限200件)

def show_latest_timeline_text(api):
    timeline = api.home_timeline(count=200)
    for i, tweet in enumerate(timeline):
        print(i, tweet.text)

自身のbioを取得する

me = api.me()
print(me.screen_name)
print(me.name)
print(me.description)
print(me.location)
print(me.url)

自身のアイコンをダウンロードする

# ./iconにhoge.jpgという名前で保存する
me = api.me()
url = me.profile_image_url
file_name = "./icon/hoge.jpg"
response = requests.get(url)
image = response.content
with open(file_name, "wb") as f:
    f.write(image)

自身のバナーをダウンロードする

me = api.me()
url = me.profile_banner_url
file_name = "./fuga.png"
response = requests.get(url)
image = response.content
with open(file_name, "wb") as f:
    f.write(image)

カレントディレクトリにfuga.pngという名前で保存する

me = api.me()
url = me.profile_image_url
file_name = "./icon/hoge.jpg"
response = requests.get(url)
image = response.content
with open(file_name, "wb") as f:
    f.write(image)

自分が追加されている公開リストを表示する

※フォロー済の鍵垢の公開リストはWeb上では見えないが、apiでは見ることが出来る

mem_list = api.lists_memberships(screen_name="digitalhimiko")
for mem in mem_list:
    print("list: " + mem.name, "screen_name: " + mem.user.screen_name)

アイコンを変更する。

同じディレクトリにiconディレクトリを作ってそこに画像を保存する。

# update icon
filename = "./icon/reading_girl.jpg"
api.update_profile_image(filename)

プロフィール(bioやスクリーンネーム、ロケーション)を変更する

update_profile()を使おう。
ちなみにリンク先のドキュメントにもある通りnameはスクリーンネーム(@以下じゃない方のユーザー名)で最大20文字。descriptionがいわゆるbioで160文字が上限。

name = "pythonから氏名を変更したよ"
url = "https://zenn.dev/kumamoto"
location = "Tokyo"
description = "pythonから変更しました"
api.update_profile(name = name, url = url, location = location, description = description)

バックグランドイメージを変える(バナー/ヘッダー、アイコンの上の画像)を変える(未検証)

update_profile_background_image()

filename = ""
api.update_profile_background_image(filename)

ブロック/ブロック解除

# idというキーワード引数ならスクリーンネームでもuser-idでもどちらでも指定可能
# 直接引数でも問題なさそう
api.create_block(id="")
api.destroy_block("")

ブロックリスト表示(TODO)

# これでブロックしたユーザーのスクリーンネームを確認
block_list = api.blocks()
for b in block_list:
    print(b.screen_name)