- curl_cffi 移行:TLS/JA3 および HTTP/2 フィンガープリントを Safari iOS に偽装 やっぱりcurl_cffiのほうが現実的
- android 7 / galaxy s9 scv38 からiOS 27 / iPhone 17 Pro への移行 android7のような古いクライアントはボット検知される
- デバイスセンサー生成:加速度・ジャイロ・タッチイベントを模擬送信
- 人間パターンシミュレータ:HumanPatternSimulator で自然なリクエストを送信
- 例外クラス拡充:Bot検知 / eKYC未完了 / アカウントロック / レート制限を明示的に検出
PayPay の非公式モバイル API クライアントライブラリです。 内部実装は PayPaython-mobile をベースにしています。
本ライブラリは PayPay 公式の提供するものではありません。PayPay 株式会社とは関係がありません。
- PayPay アプリの内部 API を利用します。非公開のため、予告なく変更・停止される可能性があります。
- 利用にあたっては PayPay の利用規約をご確認ください。アカウントが制限されるリスクがあります。
- 本番運用や金銭取引の自動化への利用は推奨しません。発生した損害について開発者は責任を負いません。
- ログイン情報・セッショントークンは
~/.oppaypay/session.jsonに保存されます。ファイルの取り扱いに注意してください。 - 日本国外からはアクセスできません(プロキシの利用が必要です)。 日本国内の無料プロキシリスト
pip install oppaypayimport oppaypay
# 仮ログイン。2FA 用のワンタイムリンクが発行されます。
# 戻り値は uuidV4 (pre_id)
pre_id = oppaypay.login(sms="08012345678", password="your_password")
print(pre_id) # uuidV4 (仮ID)
# 別のデバイスで PayPay アプリに表示されたワンタイムリンクを承認後、
# id= の部分を verifycode として入力します。
# 戻り値は uuidV7 (session_id)
session_id = oppaypay.login.otp(id=pre_id, verifycode="TK4602")
print(session_id) # uuidV7 (永続セッションID)※ SMS の 4桁 OTP は廃止されました。現在の 2FA は
https://www.paypay.ne.jp/portal/oauth2/l?id=XXXX 形式の
ワンタイムリンク承認方式です。verifycode には URL 全体または XXXX 部分を入れます。
oppaypay.login.id(id=session_id)セッション情報は ~/.oppaypay/session.json に保存され、
2回目以降は SMS 認証なしでログインできます。
Bot検知を回避するため、バックグラウンドで人間らしい操作パターンを送信します。
from oppaypay import HumanPatternSimulator
oppaypay.login.id(id=session_id)
core = oppaypay.get_core(session_id)
sim = HumanPatternSimulator(core, interval_range=(30, 180))
sim.start()
# ... アプリ使用中はバックグラウンドで自然なリクエストを送信 ...
sim.stop()interval_range はリクエスト間隔の範囲(秒)です。デフォルトは (30, 180)。
# 請求リンク (https://qr.paypay.ne.jp/...) を生成
req = oppaypay.pay.money(getpayrequestlink=session_id, billed_amount=1000)
print(req["url"]) # https://qr.paypay.ne.jp/...
print(req["buildid"]) # 取引番号
req = oppaypay.pay.money_light(getpayrequestlink=session_id, billed_amount=500)※ 請求リンクの生成自体は残高の種類に依存しません。 マネー / マネーライトの区別は支払い側で行われます。
# PayPayマネーで支払う
oppaypay.pay.confirm.money(buildid=req["url"], getid=payer_session_id)
# PayPayマネーライトで支払う
oppaypay.pay.confirm.money_light(buildid=req["url"], getid=payer_session_id)buildid には請求リンクの URL または https://qr.paypay.ne.jp/ の後ろの部分を指定します。
getid は支払う側のセッション ID です。
oppaypay.account.moneys.all(id=session_id) # 利用可能な残高(合計)
oppaypay.account.moneys.money(id=session_id) # PayPayマネー
oppaypay.account.moneys.money_light(id=session_id) # PayPayマネーライトurl = oppaypay.account.p2p(id=session_id)
print(url) # https://qr.paypay.ne.jp/...v0.2.0 では以下の例外クラスを提供します。
| 例外クラス | 説明 |
|---|---|
OpPayPayError |
汎用エラー |
OpPayPayLoginError |
ログイン失敗・トークン失効・セッション無効 |
OpPayPayNetworkError |
ネットワークエラー・レスポンスパース失敗 |
OpPayPayBotDetectedError |
Bot検知によるログアウト(S0001/S0002) |
OpPayPayEKYCRequiredError |
eKYC(本人確認)未完了 |
OpPayPayAccountLockedError |
アカウント一時ロック |
OpPayPayRateLimitError |
レート制限超過 |
from oppaypay import (
OpPayPayBotDetectedError,
OpPayPayEKYCRequiredError,
OpPayPayAccountLockedError,
OpPayPayRateLimitError,
)
try:
oppaypay.account.moneys.all(id=session_id)
except OpPayPayBotDetectedError:
print("Bot検知されました。セッションを再取得してください。")
except OpPayPayEKYCRequiredError:
print("eKYCを完了してください。")
except OpPayPayAccountLockedError:
print("アカウントがロックされています。")
except OpPayPayRateLimitError:
print("レート制限に達しました。しばらく待ってください。")from oppaypay import get_core
core = get_core(session_id)
core.alive() # Bot検知対策の無駄リクエストを手動で送る通常は HumanPatternSimulator を使うことを推奨します。
- 2025年11月以降、PayPay 側の Bot 検知強化により新規ログインが失敗する場合があります。
この場合、PayPay 公式アプリでログインし、アクセストークンを取得して
~/.oppaypay/session.jsonに登録する運用が必要になります。 - v0.2.0 では curl_cffi による TLS/HTTP2 偽装と iOS 27 偽装を実装していますが、 PayPay 側の Bot 検知は継続的にアップデートされるため、 完全な回避を保証するものではありません。
curl_cffiのバージョンによってはsafari260_iosプロファイルが存在しない場合があります。 その場合は自動的に古い Safari iOS プロファイルにフォールバックします。
| セクション | 操作 | 内容 |
|---|---|---|
| バージョン表記 | 更新 | v0.1.0 → v0.2.0 |
| v0.2.0 の変更点 | 新規追加 | curl_cffi / iOS 27 / センサー / シミュレータ / 例外 / UUID分離 |
| 人間パターンシミュレータ | 新規追加 | HumanPatternSimulator の使用例 |
| 例外クラス | 新規追加 | 7つの例外クラスの説明と使用例 |
| その他 | 更新 | core.alive() の手動呼び出し例、HumanPatternSimulator 推奨 |
| 既知の問題 | 更新 | v0.2.0 の対策と curl_cffi フォールバックの注記 |
MIT License