nobukz
@nobukz (nobukz)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【解決】「詐欺アカ作成のリスト」から、Tweepyで自分を削除したい

解決したいこと

Python+Tweepyで、自分が追加されている「詐欺アカ作成のリスト」から、自分を削除したい

発生している問題

自分をリストに載せている詐欺アカを、下記リンクの手順通りにブロックすれば確かにリストから消えるのですが、これをTweepyでやろうとしても上手く出来ません。
https://note.com/atsuko_writer55/n/n948dfc791b0c
ブロックは出来るのですが、リストから自分が消えていないのです。

作成したコードは下記です。
※下記リンクを参考にしました
https://note.com/nova603/n/nce6eba84cda4

import utils
import tweepy

user_ID="xxxxx" #あなたのID
password="xxxxx" #あなたのパスワード

block_users = "xxxxx" #ブロックしたいユーザID

api = utils.get_cookie_api(user_ID,password)
api.create_block(screen_name=block_users)

自分で試したこと

下記のコードでダメだったので、

api.create_block(screen_name=block_users)

これも試しましたが、スパム報告+ブロックというだけで、結果は同じでした。

api.report_spam(screen_name=block_users)

他にコマンドが無いか下記リンクで探したのですが、見つかっていません。
https://docs.tweepy.org/en/stable/index.html
解決法をご存じの方がいらっしゃいましたら、ご教授お願いします。

※ちなみに詐欺アカが私を載せていたリストはこんな状態でした。
詐欺アカ.png

【解決】2023.7.25追記

@surugamachi 氏にご教授頂いた praywright を試し、成功しました。
心より感謝申し上げます。

【動作フロー】
①tweepyを使用して、自分がメンバーとなっているリストを取得する
②リストを一つずつチェックし詐欺アカかどうか判定し、ブロック予定リストを作成する
■ここからpraywrightを使用
③自分のTwitterホーム画面を開く(ログイン動作含む)
④「リスト」をクリック
⑤右上の「・・・」をクリックし、「自分がメンバーとなっているリスト」をクリック
⑥事前に作成したブロック予定リストを順番に照合し、表示されているリストに同じ名前があればクリック
⑦右上の「・・・」をクリックし、「●●さん(リスト作成者)をブロックする」をクリック
⑧リスト画面に戻り、⑥~⑦を繰り返す

※とりあえず動けば良いという感じで、おかしな記述法があると思いますがご容赦ください。
※特に詐欺アカ判定のchk変数郡とif文は恥ずかしいので触れないで下さい。
※UI部分などは省いて転記したので、このままコピペでは動かない可能性があります。
※適宜修正してお使いください。

近々TwitterからXに変更され金融取引との連動メインになるとの事で、文化や言論の共有拡散ツールとしての価値は失われると思いますが、それまでの短い間、邪魔な詐欺アカ対策にご活用して頂ければ幸いです。

import utils
import tweepy
from playwright.sync_api import Playwright, sync_playwright, expect

block_lists = []
block_list_makers = []
user_ID = "xxxxxx" #あなたのTwitterID
password = "xxxxxx" #あなたのTwitterパスワード

hit_count = 0

api = utils.get_cookie_api(user_ID,password)
mem_list = api.get_list_memberships(screen_name=user_ID)
for mem in mem_list:
    chk1=0;chk2=0;chk3=0;chk4=0;chk5=0;chk6=0;chk7=0;chk8=0;chk9=0;chk10=0;chk11=0
    if str(mem.user.description).rfind("副業") > 0:chk1 = 1
    if str(mem.user.description).rfind("現金") > 0:chk2 = 1
    if str(mem.user.description).rfind("資産") > 0:chk3 = 1
    if str(mem.user.description).rfind("高配当株") > 0:chk4 = 1
    if str(mem.user.description).rfind("プレゼント") > 0:chk5 = 1
    if str(mem.user.description).rfind("経営") > 0:chk6 = 1
    if str(mem.user.description).rfind("🚺") > 0:chk7 = 1
    if str(mem.user.description).rfind("") > 0:chk8 = 1
    if mem.user.followers_count < 10:chk9 = 1
    if mem.user.statuses_count < 5:chk10 = 1
    if mem.user.favourites_count < 5:chk11 = 1
    result = "Flw-Tw-Fav:" + str(mem.user.followers_count) + "-" + str(mem.user.statuses_count) + "-" + str(mem.user.favourites_count)
    total = chk1 + chk2 + chk3 + chk4 + chk5 + chk6 + chk7 + chk8 + chk9 + chk10 + chk11
    if total > 1 or (chk10==1 and chk11==1):
        print("list: "+mem.name, "screen_name: "+mem.user.screen_name)
        block_lists.append(mem.name)
        block_list_makers.append(mem.user.screen_name)
        hit_count = hit_count +1

messagebox.showinfo("チェック処理", "抽出数:" + str(hit_count) + " / " + str(len(block_lists)) + "\n\nチェック完了しました")
messagebox.askquestion("【ブロック処理】", "検出したアカウントを全てブロックします。\n本当によろしいですか?", icon='warning')

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    page.goto("https://twitter.com/i/flow/login?redirect_after_login=%2F" + user_ID)
    page.locator("label div").nth(3).click()
    page.get_by_label("電話番号/メールアドレス/ユーザー名").fill(user_ID)
    page.get_by_role("button", name="次へ").click()
    page.get_by_label("パスワード", exact=True).click()
    page.get_by_label("パスワード", exact=True).fill(password)
    page.get_by_test_id("LoginForm_Login_Button").click()
    page.get_by_label("リスト").click()
    page.get_by_test_id("primaryColumn").get_by_label("もっと見る").click()
    page.get_by_role("menuitem", name="自分がメンバーとなっているリスト").click()
    for block_list in range(len(block_lists)):
        chk2 = page.get_by_role("link", name=block_lists[block_list])
        if chk2 == True: 
            chk2.click()          
            page.get_by_test_id("primaryColumn").get_by_label("もっと見る").click()
            chk1 = page.get_by_text("@" + block_list_makers[block_list] + "さんをブロック")
            if chk1 == True: 
                chk1.click()          
                page.get_by_test_id("confirmationSheetConfirm").click()
                print("■ 対象リストブロック完了:" + str(block_lists[block_list]) + "/@" + str(block_list_makers[block_list])) 
            else:            
                page.get_by_role("menuitem", name="報告リスト").press("Escape")

            page.get_by_test_id("app-bar-back").click()
            
        time.sleep(1)

messagebox.showinfo("ブロック処理", "ブロック完了しました")
context.close()
browser.close()
0

1Answer

Twitterapiを見ましたが、listをブロックするapiは公開されて無さそうですね。
やるならpraywrightでブラウザ経由でやるしかないかと。

3Like

Comments

  1. @nobukz

    Questioner

    @surugamachiさん、ご確認頂き感謝いたします。
    praywrightというのがあるんですね。これから調べて試してみます。
    貴重な情報を有難うございますm(_ _)m

  2. @nobukz

    Questioner

    @surugamachiさん、ご教授頂いたpraywrightを使用して実現出来ました!
    seleniumでRPAを作った事はありますが、praywrightは要素を手作業で探してトライ&エラーする手間が省けるのが素晴らしいですね。
    Q&Aを利用したのは初めてで、記事を更新できるのか解りませんが、何処かにレポートを挙げてお礼とさせていただきます。
    有難うございました。

Your answer might help someone💌