• Stars
    star
    168
  • Rank 224,621 (Top 5 %)
  • Language
    Python
  • License
    MIT License
  • Created over 1 year ago
  • Updated about 1 month ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Twitter Web App (Web 版公式クライアント) の内部 API を使い、Tweepy でスクリーンネームとパスワードで認証するためのライブラリ

tweepy-authlib

PyPI - Version PyPI - Python Version


Table of Contents

Description

Twitter Web App (Web 版公式クライアント) の内部 API を使い、Tweepy でスクリーンネームとパスワードで認証するためのライブラリです。

スクリーンネーム (ex: @elonmusk) とパスワードを指定して認証し、取得した Cookie などの認証情報で Twitter API v1.1 にアクセスできます。
毎回ログインしていては面倒 & 不審なアクセス扱いされそうなので、Cookie をファイルなどに保存し、次回以降はその Cookie を使ってログインする機能もあります。

Tweepy を利用しているソースコードのうち、認証部分 (tweepy.auth.OAuth1UserHandler) を tweepy_authlib.CookieSessionUserHandler に置き換えるだけで、かんたんに Cookie ベースの認証に変更できます!

Twitter API の有料化に伴って通常の OAuth API が利用できなくなった場合も、この CookieSessionUserHandler を使えば引き続き Twitter API v1.1 にアクセスできるはず…!
認証部分以外は OAuth API のときの実装がそのまま使えるので、ソースコードの変更も最小限に抑えられます。

Note
OAuth API と公式クライアント用の内部 API がほぼ共通だった v1.1 とは異なり、v2 では OAuth API と公式クライアント用の内部 API が大きく異なります。
そのため、CookieSessionUserHandler は Twitter API v2 には対応していません。
また、今のところ2段階認証にも対応していません (2段階認証に関しては技術的には実装可能だが、確認コードの送信周りの実装が面倒…) 。

認証フローはブラウザ上で動作する Web 版公式クライアントの API アクセス動作や HTTP リクエストヘッダーを可能な限りエミュレートしています。
ブラウザから抽出した Web 版公式クライアントのログイン済み Cookie を使うことでも認証が可能です。

Note
ブラウザから Cookie を抽出する場合、(不審なアクセス扱いされないために) できればすべての Cookie を抽出することが望ましいですが、実装上は Cookie 内の auth_tokenct0 の2つの値だけあれば認証できます。
なお、ブラウザから取得した Cookie は事前に requests.cookies.RequestsCookieJar に変換してください。

さらに API アクセス時は TweetDeck の HTTP リクエスト (Twitter API v1.1) をエミュレートしているため、レートリミットなどの制限は TweetDeck と同一です。

Note
CookieSessionUserHandler で取得した認証情報を使うと、TweetDeck でしか利用できない search/universal などの内部 API にもアクセスできるようになります。
ただし、Tweepy はそうした内部 API をサポートしていないため、アクセスするには独自に tweepy.API.request() で HTTP リクエストを送る必要があります。

Warning
このライブラリは、非公式かつ内部的な API をリバースエンジニアリングし、ブラウザとほぼ同じように API アクセスを行うことで、本来 Web 版公式クライアントでしか利用できない Cookie 認証での Twitter API v1.1 へのアクセスを可能にしています。
可能な限りブラウザの挙動を模倣することでできるだけ Twitter 側に怪しまれないような実装を行っていますが、非公式な方法ゆえ、このライブラリを利用して Twitter API にアクセスすると、最悪アカウント凍結やシャドウバンなどの制限が適用される可能性もあります。
また、Twitter API の仕様変更により、このライブラリが突然動作しなくなることも考えられます。
このライブラリを利用して API アクセスを行うことによって生じたいかなる損害についても、著者は一切の責任を負いません。利用にあたっては十分ご注意ください。

Warning
スクリーンネームとパスワードを指定して認証する際は、できるだけログイン実績のある IP アドレスでの実行をおすすめします。
このライブラリでの認証は、Web 版公式クライアントのログインと同じように行われるため、ログイン実績のない IP アドレスから認証すると、不審なログインとして扱われてしまう可能性があります。
また、実行毎に毎回認証を行うと、不審なログインとして扱われてしまう可能性が高くなります。
初回の認証以降では、以前認証した際に保存した Cookie を使って認証することを強く推奨します。

Installation

pip install tweepy-authlib

Usage

With JSON

import json
import os
import tweepy
from pathlib import Path
from requests.cookies import RequestsCookieJar
from tweepy_authlib import CookieSessionUserHandler

try:
    terminal_size = os.get_terminal_size().columns
except OSError:
    terminal_size = 80

# 保存した Cookie を使って認証
## 毎回ログインすると不審なログインとして扱われる可能性が高くなるため、
## できるだけ以前認証した際に保存した Cookie を使って認証することを推奨
if Path('cookie.json').exists():

    # 保存した Cookie を読み込む
    with open('cookie.json', 'r') as f:
        cookies_dict = json.load(f)

    # RequestCookieJar オブジェクトに変換
    cookies = RequestsCookieJar()
    for key, value in cookies_dict.items():
        cookies.set(key, value)

    # 読み込んだ RequestCookieJar オブジェクトを CookieSessionUserHandler に渡す
    auth_handler = CookieSessionUserHandler(cookies=cookies)

# スクリーンネームとパスワードを指定して認証
else:

    # スクリーンネームとパスワードを渡す
    ## スクリーンネームとパスワードを指定する場合は初期化時に認証のための API リクエストが多数行われるため、完了まで数秒かかる
    try:
        auth_handler = CookieSessionUserHandler(screen_name='your_screen_name', password='your_password')
    except tweepy.HTTPException as ex:
        # パスワードが間違っているなどの理由で認証に失敗した場合
        if len(ex.api_codes) > 0 and len(ex.api_messages) > 0:
            error_message = f'Code: {ex.api_codes[0]}, Message: {ex.api_messages[0]}'
        else:
            error_message = 'Unknown Error'
        raise Exception(f'Failed to authenticate with password ({error_message})')
    except tweepy.TweepyException as ex:
        # 認証フローの途中で予期せぬエラーが発生し、ログインに失敗した
        error_message = f'Message: {ex}'
        raise Exception(f'Unexpected error occurred while authenticate with password ({error_message})')

    # 現在のログインセッションの Cookie を取得
    cookies = auth_handler.get_cookies()

    # Cookie を pickle 化して保存
    with open('cookie.json', 'w') as f:
        json.dump(cookies.get_dict(), f, ensure_ascii=False, indent=4)

# Tweepy で Twitter API v1.1 にアクセス
api = tweepy.API(auth_handler)
print('-' * terminal_size)
print(api.verify_credentials())
print('-' * terminal_size)
print(api.home_timeline())
print('-' * terminal_size)

# 継続してログインしない場合は明示的にログアウト
## 単に Cookie を消去するだけだと Twitter にセッションが残り続けてしまう
## ログアウト後は、取得した Cookie では再認証できなくなる
#auth_handler.logout()
#os.unlink('cookie.json')

With Pickle

import os
import pickle
import tweepy
from pathlib import Path
from tweepy_authlib import CookieSessionUserHandler

try:
    terminal_size = os.get_terminal_size().columns
except OSError:
    terminal_size = 80

# 保存した Cookie を使って認証
## 毎回ログインすると不審なログインとして扱われる可能性が高くなるため、
## できるだけ以前認証した際に保存した Cookie を使って認証することを推奨
if Path('cookie.pickle').exists():

    # 保存した Cookie を読み込む
    with open('cookie.pickle', 'rb') as f:
        cookies = pickle.load(f)

    # 読み込んだ RequestCookieJar オブジェクトを CookieSessionUserHandler に渡す
    auth_handler = CookieSessionUserHandler(cookies=cookies)

# スクリーンネームとパスワードを指定して認証
else:

    # スクリーンネームとパスワードを渡す
    ## スクリーンネームとパスワードを指定する場合は初期化時に認証のための API リクエストが多数行われるため、完了まで数秒かかる
    try:
        auth_handler = CookieSessionUserHandler(screen_name='your_screen_name', password='your_password')
    except tweepy.HTTPException as ex:
        # パスワードが間違っているなどの理由で認証に失敗した場合
        if len(ex.api_codes) > 0 and len(ex.api_messages) > 0:
            error_message = f'Code: {ex.api_codes[0]}, Message: {ex.api_messages[0]}'
        else:
            error_message = 'Unknown Error'
        raise Exception(f'Failed to authenticate with password ({error_message})')
    except tweepy.TweepyException as ex:
        # 認証フローの途中で予期せぬエラーが発生し、ログインに失敗した
        error_message = f'Message: {ex}'
        raise Exception(f'Unexpected error occurred while authenticate with password ({error_message})')

    # 現在のログインセッションの Cookie を取得
    cookies = auth_handler.get_cookies()

    # Cookie を pickle 化して保存
    with open('cookie.pickle', 'wb') as f:
        pickle.dump(cookies, f)

# Tweepy で Twitter API v1.1 にアクセス
api = tweepy.API(auth_handler)
print('-' * terminal_size)
print(api.verify_credentials())
print('-' * terminal_size)
print(api.home_timeline())
print('-' * terminal_size)

# 継続してログインしない場合は明示的にログアウト
## 単に Cookie を消去するだけだと Twitter にセッションが残り続けてしまう
## ログアウト後は、取得した Cookie では再認証できなくなる
#auth_handler.logout()
#os.unlink('cookie.pickle')

License

MIT License

More Repositories

1

KonomiTV

KonomiTV: Kept Organized, Notably Optimized, Modern Interface TV media server
Python
576
star
2

Real-ESRGAN-GUI

Lovely Real-ESRGAN / Real-CUGAN GUI Wrapper
Dart
473
star
3

TVRemotePlus

PHP / JavaScript 製のテレビのリモート視聴ソフト(いわゆるロケフリ)
PHP
167
star
4

Aivis

💠 Aivis: AI Voice Imitation System
Python
143
star
5

youtube-live-chat-flow

Chrome Extension for Flow Chat Messages on YouTube Live (Mirror). ⚠️Please use subdiox's fork instead!! (https://chrome.google.com/webstore/detail/flow-chat-for-youtube-liv/elfdpkmfllnhhgnicaaeacbilcallpbd, source: https://github.com/subdiox/youtube-live-chat-flow)
TypeScript
138
star
6

DTV-Builds

TS抜き(DTV)関連ソフトウェアのビルド済みアーカイブ
129
star
7

libmali-rockchip

Rockchip Userspace Mali GPU Driver and Debian Packages (Mirror of https://github.com/JeffyCN/mirrors/tree/libmali)
C
81
star
8

weather-api

天気予報 API(livedoor 天気互換)
PHP
60
star
9

ISDBScanner

受信可能な日本のテレビチャンネル (ISDB-T/ISDB-S) を全自動でスキャンし、スキャン結果を様々な形式で出力するツール
Python
35
star
10

EDCB-Wine

EDCB を Wine を使って Linux 上で動作させるための Docker Compose 構成
Lua
28
star
11

EDCBNotifier

EDCB から LINE・Discord・Twitter に通知を送るツール
Python
27
star
12

jikkyo-api

ニコニコ実況 過去ログ API(非公式)
PHP
22
star
13

TarakoTalk

Cross-platform CLI TTS Tools for Hiroyuki's Voice
Python
20
star
14

QuaStation-Ubuntu

Qua Station 向けの Linux カーネルのビルドと、Ubuntu 20.04 LTS の rootfs の構築を全自動で行うスクリプト
Shell
15
star
15

NX-Jikkyo

NX-Jikkyo: Nico Nico Jikkyo Alternative
TypeScript
12
star
16

librga-rockchip

Userspace interface to Rockchip RGA 2D accelerator (Source available, Mirror of https://github.com/JeffyCN/mirrors/tree/linux-rga-multi)
C++
12
star
17

rplsinfo

rplsファイル / TSファイルの番組情報をテキスト出力するツール (Mirror)
C++
11
star
18

ShadowbanAlerts

Twitter アカウントへのシャドウバンが開始・解除された時に Discord に通知するツール
Python
11
star
19

EITViewer

放送波の MPEG2-TS に重畳されている EIT (Event Information Table: 番組情報) の生データを時系列でいい感じに表示するツール
TypeScript
10
star
20

JKCommentCrawler

ニコニコ実況・NX-Jikkyo の過去ログを日付ごとに一括で収集・保存するツール
Python
10
star
21

BonDriver_UDP-TCP

BonDriver_UDP・BonDriver_TCP (Mirror)
C++
8
star
22

rplsTOOL

rplsファイル / TSファイルの番組情報を表示・編集するツール (Mirror)
C++
7
star
23

AnimeGANv3-Python

A command-line tool that transforms photos into an anime look using ONNX Runtime trained models of AnimeGANv3.
Python
7
star
24

TwitterRevertRT

Twitter の RT の仕様変更を元に戻す Chrome 用拡張機能
JavaScript
6
star
25

NDGRClient

NDGRClient: Nicolive NDGR Message Server Client Library & Command Line Tool
Python
6
star
26

Storehouse

倉庫
5
star
27

LED-Movie-Player

動画・音声を読み込んで LED マトリクスパネル上で再生させるラズパイ用ソフト
C++
5
star
28

twittertoken-viewer

Smarty
4
star
29

KonomiTV-API

KonomiTV Utility API
TypeScript
3
star
30

TvmaidMAYA

Windows 向け録画予約プログラム (Mirror)
C#
2
star
31

TSTaskCentreEx

TSTask へメッセージコマンドを送信するコマンドラインツール
C#
1
star
32

ts-nhk-canceler

C++
1
star